Feb 10
2009

Um per JavaScript in ASP.NET auf eine Checkbox zuzugreifen und deren Checked-Status abzurufen, kann man sich unterschiedlicher Syntax bedienen. Es ist jedoch zu beachten, dass Browser wie der IE oder der FF unterschiedlich reagieren können. Im schlechtesten Fall ignoriert der Browser den Code komplett, wenn es darum geht, über die ClientID auf das Control zuzugreifen.

Mir ist das im u.g. Codeschnippsel zum Thema Custom Validation einer CheckBox passiert. Mit "document.all" hat sich zwar der IE zufrieden gegeben, im FF hingegen hat die entsprechende Codezeile nicht funktioniert. Anders mit "$get". Diese Syntax verstehen beide Browser.

 <asp:CheckBox 
     ID="cbxTermsLoggedIn" 
     runat="server" 
     ValidationGroup="grpvalB2BLoggedInRegistration" /> 

<script language="javascript" type="text/javascript"> 
    function ClientValidationCbxTermsLoggedIn(source, args) 
    { 
        //use:
        var cbx = $get('<%=cbxTermsLoggedIn.ClientID %>');
        args.IsValid = cbx.checked;

        //instead of:
        //args.IsValid = document.all["<%=cbxTermsLoggedIn.ClientID %>"].checked; 
    } 
 </script>

<asp:CustomValidator 
    ID="cstmvalB2BRegistrationTermsLoggedIn" 
    runat="server" 
    SetFocusOnError="true" 
    Display="Dynamic" 
    ErrorMessage="Sie müssen der Speicherung zustimmen"
    ClientValidationFunction="ClientValidationCbxTermsLoggedIn" 
    ValidationGroup="grpvalB2BLoggedInRegistration"
    ValidateEmptyText="True" />

Tags:
Jan 28
2009

Um eine ASP.NET DropDownList mit Werten aus einem Enum zu füllen, gibt es unterschiedliche Ansätze.

Beispielsweise kann das Enum für einen LoginStatus folgendermaßen aussehen:

/// <summary>
/// enum for login status
/// </summary>
public
enum LoginState
{
  Inactive = -1,
  Active = 1,
  Deactivated = 2
}

Um das DropDown mit den Werten des Enum zu füllen, sind zwei Zeilen Code ausreichend:

/// <summary>
/// fills ddlContactPersonLoginState
/// </summary>
private void FillContactPersonLoginStateDropDown()
{
  ddlContactPersonLoginState.DataSource =
Enum.GetNames(typeof(LoginState));
  ddlContactPersonLoginState.DataBind();
}

Allerdings hat diese Lösung zur Folge, dass value und key im DropDown gleich sind.

 

Ein anderer Ansatz über eine Hilfsmethode erlaubt es, value und key separat zu ermitteln
und dem DropDown als DataValueField und DataTextField zuzuweisen:

/// <summary>
/// helpermethod to store enum values and their corresponding names in a SortedList
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static SortedList<string, int> GetEnumDataSource<T>() where T : struct
{
 
Type myEnumType = typeof(T);
 
if (myEnumType.BaseType != typeof(Enum))
  {
   
throw new ArgumentException("Type T must inherit from System.Enum");
  }

  SortedList<string, int> returnCollection = new SortedList<string, int>();
 
string[] enumNames = Enum.GetNames(myEnumType);

  for (int i = 0; i < enumNames.Length; i++)
  {
    returnCollection.Add(enumNames[i], (
int)Enum.Parse(myEnumType, enumNames[i]));
  }
  return returnCollection;

}

Das Füllen des DropDowns muss jetzt etwas erweitert werden:

/// <summary>
/// fills ddlContactPersonLoginState
/// </summary>
private
void FillContactPersonLoginStateDropDown()
{
 
ddlContactPersonLoginState.DataSource = GetEnumDataSource<LoginState>();
 
ddlContactPersonLoginState.DataValueField = "Value";
  ddlContactPersonLoginState.DataTextField ="Key";
  ddlContactPersonLoginState.DataBind();
}

Jetzt stehen im DropDown Value und Key für die weitere Verarbeitung zur Verfügung.

Tags:
Oct 16
2008

Obwohl mit ASP.NET 3.5 das neue ListView Control und das neue DataPager Control zur Verfügung stehen, ist in vielen bestehenden Webseiten das GridView Control aus ASP.NET 2.0 in Anwendung. Eigentlich ein sehr leistungsfähiges Control, welches von Haus aus schon Unterstützung für Paging und Sorting bietet. Will oder muss man allerdings ein eigenes Paging implementieren, dann sind doch einige Zeilen Code selbst zu schreiben und einige Dinge zu beachten. Zum Thema "Custom Paging" im GridView habe ich im Netz einen interessanten Artikel im Blog von Francisco Santos Jr. gefunden, der allerdings im Detail schwer nachzuvollziehen ist, da einige wichtige Codepassagen fehlen.

Nachfolgend meine Lösung, die auf dem o.g. Blogeintrag basiert, jedoch versucht, dessen Schwachstellen weitestgehend zu beseitigen. Das Paging kann optisch etwa so aussehen:

 

aspx-Code (PagerTemplate für das GridView):

            <PagerTemplate>
                <asp:ImageButton
                    ID="btnFirst" runat="server" ToolTip="zur ersten Seite" ImageUrl="~/img/first.gif" CommandArgument="First" OnCommand="TurnThePage" />
                <asp:ImageButton
                    ID="btnPrevious" runat="server" ToolTip="zur vorherigen Seite" ImageUrl="~/img/previous.gif" CommandArgument="Prev" OnCommand="TurnThePage" />
                    Seite
                <asp:DropDownList
                    ID="ddlPages" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlPages_SelectedIndexChanged" />  von
                <asp:Label ID="lblPageCount" runat="server" />

                <asp:ImageButton
                    ID="btnNext" runat="server" ToolTip="zur nächsten Seite" ImageUrl="~/img/next.gif" CommandArgument="Next" OnCommand="TurnThePage" />
                <asp:ImageButton
                    ID="btnLast" runat="server" ToolTip="zur letzten Seite" ImageUrl="~/img/last.gif" CommandArgument="Last" OnCommand="TurnThePage" />
        </PagerTemplate>

  cs-Code:

         /// <summary>
        /// when page is changed by dropdown
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
            DropDownList ddlPages =(DropDownList)gvrPager.Cells[0].FindControl("ddlPages");

            grdvwCompanies.PageIndex = ddlPages.SelectedIndex;

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// when page is changed by clicking pager arrows
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void grdvwCompanies_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
            DropDownList ddlPages =(DropDownList)gvrPager.Cells[0].FindControl("ddlPages");
            grdvwCompanies.PageIndex = ddlPages.SelectedIndex;

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// method for OnCommand in imagebutton
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TurnThePage(object sender, CommandEventArgs e)
        {
            // get the current page selected
            int intCurIndex = grdvwCompanies.PageIndex;

            switch (e.CommandArgument.ToString().ToLower())
            {
                case "first":
                    grdvwCompanies.PageIndex = 0;
                    break;
                case "prev":
                    grdvwCompanies.PageIndex = intCurIndex - 1;
                    break;
                case "next":
                    grdvwCompanies.PageIndex = intCurIndex + 1;
                    break;
                case "last":
                    grdvwCompanies.PageIndex = grdvwCompanies.PageCount;
                    break;
            }

            // populate gridView
            DoCompanySearch(searchTerm);
        }

        /// <summary>
        /// event when data are bound to gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void grdvwCompanies_DataBound(object sender, EventArgs e)
        {
            GridViewRow gvrPager = grdvwCompanies.BottomPagerRow;
           
            if (gvrPager == null) return;
            gvrPager.Visible = true;
            // get controls from the gridview
            DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");
            Label lblPageCount = (Label)gvrPager.Cells[0].FindControl("lblPageCount");

            if (ddlPages != null)
            {
                // populate pager
                for (int i = 0; i < grdvwCompanies.PageCount; i++)
                {
                    int intPageNumber = i + 1;
                    ListItem lstItem = new ListItem(intPageNumber.ToString());

                    if (i == grdvwCompanies.PageIndex)
                        lstItem.Selected = true;

                    ddlPages.Items.Add(lstItem);
                }
            }

            // populate page count
            if (lblPageCount != null)
                lblPageCount.Text = grdvwCompanies.PageCount.ToString();

            //– For First and Previous ImageButton
            if (grdvwCompanies.PageIndex == 0)
            {
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnFirst")).Enabled = false;
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnPrevious")).Enabled = false;
            }

            //– For Last and Next ImageButton
            if (grdvwCompanies.PageIndex+1 == grdvwCompanies.PageCount)
            {
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnLast")).Enabled = false;
                ((ImageButton)grdvwCompanies.BottomPagerRow.FindControl("btnNext")).Enabled = false;
            }
        }

Tags: Tags: |
Sep 17
2008

LINQ ist eine Komponente von Microsofts .NET-Framework, mit der SQL-, XLink- und XQuery-Anfragen direkt in .NET-Programmiersprachen wie C# 3.0 oder VB.Net 9.0 als Code statt als String eingebunden werden können. So wird LINQ in Wikipedia einleitend beschrieben. Um erste Eindrücke von LINQ (Language INtegrated Query) gewinnen zu können oder um den Umgang mit LINQ zu lernen, gibt es das hervorragende Tool LINQPad. Auf www.linqpad.net wird die kostenlose Software kurz beschrieben und zum Download angeboten. LINQPad unterstützt C# 3.0 und das Framework 3.5, hier

  • LINQ to SQL
  • LINQ to Objects
  • LINQ to XML

Es werden u.a. 200 Beispiele aus dem Buch "C# 3.0 in a Nutshell" mitgeliefert, eine sehr gute Ausgangsbasis, um eigene Statements zu erstellen. LINQPad erfordert keine Installation. Einfach downloaden und starten.

Was ich besonders beeindruckend und lehrreich finde, ist

  • die Vorschau des Query-Ergebnisses (hier im Falle einer C# Expression),

 

  • die LINQ-Syntax-Ansicht

 

  • sowie das gleichbedeutende "klassische" SQL-Statement.  

 

 

Tags: Tags:
Aug 21
2008

Seit einigen Tagen gibt es das ASP.NET Framework 3.5 SP 1 zum Download (incl. SP1 für VS2008). Das Release enthält zahlreiche Bugfixes und einige neue Features.

O-Ton aus der ASP.NET-Website => http://www.asp.net/downloads/3.5-SP1/:

  • Enabling high-productivity data scenarios by using ASP.NET Dynamic Data.
  • Supporting the browser navigation in ASP.NET AJAX applications by using ASP.NET AJAX browser history.
  • Increasing the download speed for ASP.NET applications by using ASP.NET AJAX script combining.

Es wird sich wohl erst in der praktischen Anwendung zeigen, wo die Verbesserungen liegen und welchen Mehrwert sie dem Entwickler bieten.

Tags: Tags: |
Jul 18
2008

Die Unterstützung der ASP.NET 2.0 Webparts im Firefox ist von Microsoft in den letzten ASP.NET Releases leider stark vernachläßigt worden. Besonders die Drag and Drop Funktionalität funktioniert im FF und auch in anderen Browsern überhaupt nicht. Nach längerer Recherche im Web bin ich nun endlich fündig geworden, wie z.B. im Firefox oder im Opera das Drag and Drop für die Webparts ermöglicht werden kann.

Man muss dazu die Microsoft ASP.NET Futures (July 2007) downloaden und installieren. Es handelt sich um ein technology preview release, ist also ohne Support für Produktivseiten. Allerdings - ohne geht Drag and Drop in den genannten Browsern derzeit einfach nicht.

Nach dem Download und dem Ausführen des *.msi Files ist die entspreche Dll im VS2008 in der ToolBox zu registrieren. Die DLL sollte unter c:\Programme\Microsoft ASP.NET\ASP.NET Futures July 2007\v1.3.61025\3.5\Microsoft.Web.Preview.dll zu finden sein. Erst danach stehen die Futures-Controls zur Verfügung:

 

Nun muss lediglich im Code z.B. der Default.aspx oder der Masterpage ein Verweis auf den ScriptManger hinzugefügt werden und im betroffenen Control oder in der betroffenen aspx-Seite müssen ein paar kleine Ergänzungen erfolgen:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<%@ Register Assembly="Microsoft.Web.Preview" Namespace="Microsoft.Web.Preview.UI.Controls.WebParts" TagPrefix="cc1" %>
<cc1:WebPartManager ID="WebPartManager1" runat="server" />
<cc1:WebPartZone ID="WebPartZone1" runat="server">

Neben der Registrierung der Assembly muss also für den WebPartManager und für WebPartZone(s) der Tag von <asp:WebPartManager ...  zu <cc1:WebPartManager ... geändert werden. Dann klappt das Drag And Drop auch in Browsern wie Firefox und Opera. Vielleicht schafft es Microsoft ja, in der nächsten ASP.NET Version solche von vielen Usern erwünschten Funktionalitäten zu integrieren.

Tags: Tags: | |