DevTrain

Autor: Hannes Preishuber

Drop Down Liste in Gridview und DBNull

Das Einbinden einer Dropdown Liste in ein Gridview Steuerelement zur Auswahl eines Wertes ist leicht zu realsieren. Dies wird auch hier beschrieben.

Problematisch wird es wenn im Feld der Tabelle Werte enthalten sind die nicht in der Liste stehen. Da knn z.B. ein nicht gefülltes Feld sein das dann den Wert DBNull enthält. Es kann dann keine Datenbindung per Bind durchgeführt werden.

SelectedValue='<%# Bind("PostalCode") %>'

Hier ist echtes Coding nötig. Zuerst muss man in das Erstellen der Reihe eingreifen, aber nur wenn sich diese Reihe im Edit Modus befindet. Das Gridview Steuerelement hat dazu das passende RowCreated Event.

Wenn der Feldwert in der Liste vorhanden ist soll auch gleichzeitig dieser selektiert sein .

Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)

If (e.Row.RowState And DataControlRowState.Edit) <> 0 OrElse (e.Row.RowState And DataControlRowState.Insert) <> 0 Then

Try

Dim tmp As DropDownList = CType(e.Row.FindControl("drpPLZ"), DropDownList)

tmp.DataBind()

If Not IsNothing(tmp.Items.FindByValue(DataBinder.Eval(e.Row.DataItem, "postalcode").ToString())) Then

tmp.SelectedValue = DataBinder.Eval(e.Row.DataItem, "postalcode").ToString()

End If

Catch ex As Exception

End Try

End If

End Sub

Wenn die Daten für die Liste aus der Datenbank kommen muss Databind ausgeführt werden. Dies ist bei statisch deklarierten Einträgen nicht nötig.

Der Vollständigkeit halber auch der HTML Teil der ASPX Seite.

<asp:TemplateField HeaderText="PostalCode" SortExpression="PostalCode">

<EditItemTemplate>

<asp:SqlDataSource ID="sqlDSPLZ" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>"

SelectCommand="SELECT DISTINCT PostalCode FROM Customers ORDER BY PostalCode" CacheDuration="600" EnableCaching=true></asp:SqlDataSource>

<asp:DropDownList ID="drpPLZ" runat="server"

DataSourceID="sqlDSPLZ" DataValueField="postalcode" DataTextField="postalcode" >

</asp:DropDownList>

</EditItemTemplate>

<ItemTemplate>

<asp:Label ID="Label1" runat="server" Text='<%# Bind("PostalCode") %>'></asp:Label>

</ItemTemplate>

</asp:TemplateField>

Um die Liste der Postleitzahlen nur einmal zu laden kann das SQLDatasource Steuerelement ausserhalb des Template Fields platziert werden oder wie in diesem Fall Caching aktiviert werden.

Jetzt fehlt nur noch den Wert auch wieder zu speichern. Dazu muss man die Parameter setzen bevor das Update Statement ausgeführt wird. Das passende Event dazu heisst Rowupdating. Die Parameter Neu sind über NewValues zu erreichen. Dann einfach noch den SelectedVlaue aus der DropDownliste zweisen.

Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)

e.NewValues("postalcode") = CType(GridView1.Rows(e.RowIndex).FindControl("drpPLZ"), DropDownList).SelectedValue

End Sub

So viel Spass damit.

 

 

 


Erfasst am: 02.02.2006 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=968
© Copyright 2003 ppedv AG - http://www.ppedv.de