DevTrain .NET Developers Home. Das Community Portal für ASP.NET, Visual Basic, C#
 
  Login Status: Hallo   Anmelden  Suche:  
Navigationslinks überspringen
Startseite
Artikel
Blogs
Foren
ClubClub erweitern

 
Ihre Optionen
Save
Mail
Print
Rate
 
Advertising
  VSone vom 24.-25. Februar 2010 im ehem. IMAX München

 
Navigationslinks überspringen
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.

 

 

 


Diskutieren Sie in den Foren

Visual Studio 1 Magazin