2008-09-24 8 views
2

Dans ASP.NET, si je note une grille avec un tableau d'objets, disons, comment puis-je récupérer et utiliser foo (index) lorsque l'utilisateur sélectionne la ligne?GridView Ligne au type d'objet

-à-dire

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

En Ligne Sélectionnez

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 

Répondre

2

Si vous pouvez être sûr que l'ordre des éléments dans votre source de données n'a pas changé, vous pouvez utiliser la propriété CommandArgument de CommandEventArgs.

Cependant, une méthode plus robuste consiste à utiliser les propriétés DataKeys/SelectedDataKey de GridView. Le seul inconvénient est que votre commande doit être de type "Select" (ainsi, par défaut, RowCommand n'aura pas accès à DataKey).

En supposant que vous avez une certaine unicité dans les entités composant votre liste, vous pouvez définir un ou plusieurs noms de propriété de clé dans la propriété DataKeys de GridView. Lorsque l'élément sélectionné dans GridView est défini, vous pouvez récupérer vos valeurs de clé et localiser l'élément dans votre liste de liens. Cette méthode vous permet d'éviter que la position ordinale de GridView ne corresponde à la position ordinale de votre élément dans la source de données.

Exemple:

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

Ensuite, le code-behind (ou en ligne) pour la page serait quelque chose comme:

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; 
} 

Un autre choix serait d'aller spéléo dans la collection Lignes de GridView, récupérer des valeurs une colonne à la fois en obtenant des valeurs de contrôle, mais ce n'est pas recommandé, sauf si vous devez le faire.

Espérons que cela aide.

0

en théorie l'indice de la ligne, devrait être l'indice de foo (peut-être 1 pour la ligne d'en-tête, vous devrez tester). , vous devriez être en mesure de faire quelque chose le long de ces lignes

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

L'autre alternative est de trouver un moyen de DataBind l'indice à l'attribut CommandArgument du bouton.

0

Il existe probablement une méthode plus simple, mais vous pouvez définir la propriété CommandArgument de la ligne sur son index. Alors quelque chose comme foo(CInt(e.CommandArgument)) ferait l'affaire.

Questions connexes