2008-09-24 4 views
2

ASP.NETで、オブジェクトの配列を使用してグリッドビューをデータバインドすると、ユーザーが行を選択したときにfoo(インデックス)を取得して使用するにはどうすればよいですか?GridViewのオブジェクト型への変換

行のインデックス理論的には

dim fooArr() as foo; 
gv1.datasource = fooArr; 
gv1.databind(); 
行選択で

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 

答えて

2

データソース内のアイテムの順序が変更されていないことがわかっている場合は、CommandEventArgsのCommandArgumentプロパティを使用できます。

ただし、より堅牢な方法は、GridViewのDataKeys/SelectedDataKeyプロパティを使用することです。唯一の注意点は、コマンドのタイプが「Select」でなければならないことです(デフォルトでは、RowCommandはDataKeyにアクセスできません)。

リストを構成するエンティティに一意性があると仮定すると、GridViewのDataKeysプロパティに1つ以上のキープロパティ名を設定できます。 GridViewで選択した項目が設定されている場合、キー値を取得して、バインドされたリスト内の項目を見つけることができます。このメソッドは、GridView内の順序位置がデータソース内の要素の順序位置と一致しないという問題を解決します。

例:もう一つの選択はのRowsコレクションに洞窟探検に行くことであろう

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

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

そのページのコードビハインド(またはインライン)のようなものになるだろうGridViewでは、コントロール値を取得して一度に1つの列を値を取得しますが、そうしなければならない場合は推奨されません。

これが役に立ちます。

0

つまり、あなたがテストする必要がありますのfooのインデックス(ヘッダー行のための多分1、でなければなりません)。そう、あなたはこれらの線に沿って

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

を何かを行うことができるはず他の代替は、ボタンのcommandArgument属性にインデックスをデータバインドする方法を見つけることです。

0

これを行うにはもっときれいな方法がありますが、行のCommandArgumentプロパティをインデックスに設定できます。次に、foo(CInt(e.CommandArgument))のようなものがそのトリックを行います。

関連する問題