GridView行到对象类型

时间:2020-03-06 14:39:40  来源:igfitidea点击:

在ASP.NET中,如果我将网格视图与对象数组进行数据绑定,可以说,当用户选择该行时如何检索和使用foo(index)?

IE。

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

解决方案

从理论上讲,该行的索引应为foo的索引(对于标题行,可能为+1,我们需要进行测试)。因此,我们应该能够按照以下方式做一些事情

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

另一种选择是找到一种将索引数据绑定到按钮的commandArgument属性的方法。

可能有一种更干净的方法,但是我们可以将行的CommandArgument属性设置为其索引。然后像foo(CInt(e.CommandArgument))这样的东西就可以解决问题。

如果可以确定数据源中项目的顺序没有更改,则可以使用CommandEventArgs的CommandArgument属性。

但是,一种更可靠的方法是使用GridView的DataKeys / SelectedDataKey属性。唯一的警告是命令必须为"选择"类型(因此,默认情况下,RowCommand将无权访问DataKey)。

假设列表中的实体具有唯一性,则可以在GridView的DataKeys属性中设置一个或者多个键属性名称。设置GridView中的选定项后,我们可以检索键值并在绑定列表中找到该项。此方法使我们摆脱了GridView中的序数位置与数据源中元素的序数位置不匹配的问题。

例子:

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

然后,该页面的代码(或者内联代码)将类似于:

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

另一种选择是在GridView的Rows集合中进行拼写,通过获取控件值来一次获取一列的值,但这是不建议的,除非必须这样做。

希望这可以帮助。