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集合中进行拼写,通过获取控件值来一次获取一列的值,但这是不建议的,除非必须这样做。
希望这可以帮助。