Gott sei Dank muss man in ASP.NET 2.0 kaum richtigen Code schreiben. Manchmal braucht man es dann aber doch. Ich hatte das dringende Bedürfnis zwei Gridview Controls ineinander zu verschachteln. Dazu brauche ich aber die ID der aktuellen Reihe.
Die Row ID auszulesen der aktuellen Spalte ist aber auch in anderen Szenarien nützlich . Die logische Nummer ist als ID nicht gut geignet, weil sich diese z.B. durch umsortieren ändern kann. Am besten nimmt man den oder die Primary Keys die dem Control im Attribut Datakeynames übergeben werden.
Hier folgt eine Auflistung der Möglichkeiten je Control, allerdings nur mit einem Primary Key.
Gridview
Da ein Gridview meist mehr als einen Datensatz anzeigt, muss man ein Event auswählen das für jede Zeile gefeuert wird. Dabei hilft grundsätzlich RowDataBound. Diese Event erhält einen Parameter e der eine Referenz auf die aktuelle Row enthält. Diese wiederum kann per Dataitemindex identifiziert werden. Der Index wird dann als "Suchbegriff" verwendet um den richtigen Wert in den Datakeys zu finden.
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) If e.Row.DataItemIndex >= 0 Then dim id as string=GridView1.DataKeys(e.Row.DataItemIndex).Value End If End Sub |
Da die Überschrift zwar eine Reihe darstellt, aber keinen Datakey enthält, muss sichergestellt werden das kein Laufzeitfehler auftritt. Dies wird hier mit der IF Verzweigung erledigt.
Detailsview & Formview
Beiden Controls ist gemein das sie nur einen Datensatz anzeigen. Trotzdem können Sie pagen und dann möchte man gerne die RowID auslesen. Erschwerend kommt hinzu wenn diese nicht angezeigt werden soll. Diesesmal kommt das Event Databound zum Einsatz.
Dies wird gefeuert, wenn die Datenbindung vollständig ( für den einen Datensatz durchgeführt wurde). Hier kommt die Eval Funktion des Databinders zum Einsatz. Vielleicht kennen Sie die Syntax von ASP.NET 1.1. Dort wurden in TemplateColumns auf deise Art ein Feld angesprochen bzw dessen Inhalt ausgegeben. Heute nimmt man in ASP.NET 2.0 dafür ja Eval, XPath oder Bind. Diese Kurz Kommandos funktionieren im Code aber nicht. Also muss die alte vollständige Schreibweise databinder.Eval ect verwendet werden.
Protected Sub DetailsView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Response.Write(DataBinder.Eval(DetailsView1.DataItem, "CustomerID").ToString()) End Sub |
Datalist & Repeater
Als nächstes versuchen wir im Datalist Control die aktuelle ID einer Reihe zu erhalten. Hier zeigt sich das dieser Artikel seine Berechtigung hat. Diesemal heist das passende Event ItemDataBound. Passenderweise liefert der Parameter e ohne großen Hickhack per Item.Dataitem den passenden Wert zum Keyfeld.
Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Dim id As String = e.Item.DataItem("CustomerID") End Sub |
Beim Repeater Control funktionierts genauso.