2008-09-24 18 views
2

In ASP.NET, wenn ich eine Gridview mit einem Array von Objekten databind kann sagen, wie kann ich foo (index) abrufen und verwenden, wenn der Benutzer die Zeile auswählt?GridView-Zeile zum Objekttyp

dh

dim fooArr() as foo; 
gv1.datasource = fooArr; 
gv1.databind(); 

On Row Select

Private Sub gv1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gv1.RowCommand 

     If e.CommandName = "Select" Then 
      'get and use foo(index)  
     End If 
    End Sub 

Antwort

2

Wenn Sie sicher sein können, dass sich die Reihenfolge der Elemente in Ihrer Datenquelle nicht geändert hat, können Sie die CommandArgument-Eigenschaft von CommandEventArgs verwenden.

Eine robustere Methode besteht jedoch darin, die DataKeys/SelectedDataKey-Eigenschaften von GridView zu verwenden. Die einzige Einschränkung ist, dass Ihr Befehl vom Typ "Select" sein muss (RowCommand hat standardmäßig keinen Zugriff auf den DataKey).

Angenommen, Sie haben eine Eindeutigkeit in den Entitäten Ihrer Liste, können Sie einen oder mehrere Schlüsseleigenschaftsnamen in der DataKeys-Eigenschaft des GridViews festlegen. Wenn das ausgewählte Element in der GridView festgelegt ist, können Sie Ihre Schlüsselwerte abrufen und das Element in Ihrer gebundenen Liste suchen. Diese Methode löst das Problem aus, dass die Ordinalposition in der GridView nicht der Ordinalposition Ihres Elements in der Datenquelle entspricht.

Beispiel:

<asp:GridView ID="GridView1" runat="server" AutoGenerateSelectButton="True" 
    DataKeyNames="Name" onrowcommand="GridView1_RowCommand1" 
    onselectedindexchanged="GridView1_SelectedIndexChanged"> 
</asp:GridView> 

Dann wird der Code-Behind (oder inline) für die Seite wäre so etwas wie:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Value is the Name property of the selected row's bound object. 
    string foo = GridView1.SelectedDataKey.Value as string; 
} 

Eine andere Wahl in der Rows-Auflistung Spelunking der gehen würde GridView, das Spaltenwerte einzeln abruft, indem Kontrollwerte abgerufen werden. Dies wird jedoch nicht empfohlen, es sei denn, Sie müssen.

Hoffe, das hilft.

0

in der Theorie der Index der Zeile, sollte der Index von foo sein (vielleicht +1 für Kopfzeile, müssen Sie testen). so ist, sollten Sie in der Lage sein, etwas in diese Richtung zu tun

dim x as object = foo(e.row.selectedIndex) 

Die andere Alternative ist es, einen Weg zu finden, den Index auf das Command Attribut der Schaltfläche Databind.

0

Es gibt wahrscheinlich eine sauberere Möglichkeit, dies zu tun, aber Sie könnten die CommandArgument-Eigenschaft der Zeile auf den Index festlegen. Dann würde etwas wie foo(CInt(e.CommandArgument)) den Trick machen.