ASP.NET Calendar: Hide PrevMonthText or NextMonthText

If you use the ASP.NET Calendar Control and want to hide the PrevMonthText or NextMonthText then you need to use the PreRender-Event from the Calendar-Control.

In this example I hide the PrevMonthText (Hyperlink) when the current year and month equals calendars visible year and month. Note: You must set/init the VisibileDate-Property in Page_Load-Event. In my example I want that the start month and year of the control is set to today.

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MyCalendarControl.VisibleDate = DateTime.Now;
}
}

protected void MyCalendarControl_PreRender(object sender, EventArgs e)
{
// hide previous month link in calendar when current month and year equals calendars month and year
MyCalendarControl.PrevMonthText = DateTime.Now.Month == EventsCalendar.VisibleDate.Month && DateTime.Now.Year == EventsCalendar.VisibleDate.Year ? string.Empty : "<"
}

ASP.NET AjaxControlToolkit with IE9 Beta

When I use the ASP.NET AjaxControlToolkit with the ToolkitScriptManager in Internet Explorer 9 Beta I get on every asynchronous postback javascript errormessages like “Invalid set operation on read-only property”. Adding this HTML-Metatag

[cc lang=”html4strict”][/cc]

should fix it. But this is just a workaround not a solution.

ASP.NET Forums Thread:

http://forums.asp.net/p/1602520/4084902.aspx

AjaxControlToolkit Issue-Tracker:

http://ajaxcontroltoolkit.codeplex.com/workitem/26832

ListView: FindControl im EditItemTemplate

Hier eine einigermaßen vernünftige Lösung um in einem ListView WebControls im EditItemTemplate anzusprechen und Daten vom ListViewDataItem daran zu binden. Ersteres, also das ansprechen der WebControls, ist über den Event “OnItemEditing” kein Problem. Hier liegt beim DataItem der Hase im Pfeffer. Bisher habe ich keine Lösung gefunden an das DataItem im “OnItemEditing”-Event zu kommen. Der logische Versuch über

var dataItem = MyListView.Items[e.NewEditIndex].DataItem;

an das ListViewDataItem zu kommen schlug fehl, da es immer Null ist.

Nach langem tüfteln habe ich nun eine gute Lösung gefunden. Im “ItemDataBound”-Event wird neben dem ItemType auch der DisplayIndex mit dem EditIndex verglichen. Ist dieser gleich und der EditIndex ist gesetzt (else if-zweig) befinden wir uns EditItemTemplate und können auf die WebControls und das ListViewDataItem zugreifen.

Beispiel:

        protected void MyListView_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem && e.Item.DisplayIndex != MyListView.EditIndex)
            {
                 //ItemTemplate
                 //Hier können ganz normal die WebControls des ItemTemplates per FindControl angesprochen werden. 
            }
            else if(MyListView.EditIndex > -1 &&  e.Item.DisplayIndex == MyListView.EditIndex)
            {
                //EditItemTemplate

                var dataItem = (BeispielObject)((ListViewDataItem)e.Item).DataItem;

                var editItemDropDownList = (DropDownList)e.Item.FindControl("EditItemDropDownList");
                editItemDropDownList .DataSource = BusinessLogic.GetDataSource();
                editItemDropDownList .DataBind();
                forumCategorieDropDownList.SelectedValue = dataItem.Value;                           
           }
        }

[.NET] HttpContext und UnitTests

Da ich Unit Testing sehr mag und mehr oder weniger darauf angewiesen bin musste ich vor kurzem ein nerviges Problem lösen was vorallem des öfteren unter ASP.NET WebSites und WebServices auftritt. Verwendet man in einer Methode oder Funktion das Objekt “HttpContext” scheitert der UnitTest kläglich bzw. kann nicht weiter ausgeführt werden da in der UnitTest-Umgebung der HttpConext den Wert “null” hat. Nach ein wenig Googeln habe ich mir eine annehmbare Lösung gestrickt. Man simuliert einen HttpContext im Konstruktor der Testklasse und gaukelt somit der zu testenden Applikation einen HttpContext vor.

Hier das Code-Beispiel dafür, funktioniert bei mir einwandfrei. Der Inhalt der Variablen ist dabei relativ egal.

public class IrgendwasTest
{
public IrgendwasTest()
{
string appVirtualDir = "/";
string appPhysicalDir = @"C:\Users\";
string page = @"localhost";
string query = string.Empty;
TextWriter output = null;
SimpleWorkerRequest workerRequest = new SimpleWorkerRequest(appVirtualDir, appPhysicalDir, page, query, output);
HttpContext context = new HttpContext(workerRequest);
HttpContext.Current = context;
}
}