我有一个gridview,我以编程方式设置数据源并将其数据绑定到一个对象集合。对于创建的每一行,我在字段中使用不同的方法从对象中提取相关信息,如下所示:
<asp:TemplateField HeaderText="Aliases">
<ItemTemplate>
<%# ( (MyItem)Container.DataItem).Aliases.ToString() %>
</ItemTemplate>
</asp:TemplateField>
我的问题是,在OnRowDeleting方法中,我最好能够使用eg MyGridView.Rows [e.RowIndex] .DataItem或以其他方式访问该DataItem。但我找不到如何配置Gridview来保留DataItem。 是否可以访问使用的DataItem以及如何配置它?如果不可能,我可以访问方法绑定的值吗?或者我是否必须使用计划B并将数据源对象集合重写为数据表,然后使用datakeysnames?
答案 0 :(得分:4)
MyGridView.Rows[e.RowIndex].DataItem
通常应该可以工作,但我猜你可能依赖于视图状态来保留回发后的网格数据。在这种情况下,您将DataItem
属性设置为NULL。
解决方法是始终在网页生命周期的早期(例如page_load
)中将网格与每个回发中的实际数据重新绑定。
但是,在您的情况下,您可以很好地使用DataKeyNames
。与您的信念相反,您不需要DataTable来使用此属性。例如,如果您的类具有名为ItemId
的属性,指示对象的键,那么您可以在标记中使用DataKeyNames="ItemId"
,并使用事件的Keys属性在OnRowDeleting
中引用它参数。
答案 1 :(得分:2)
根据MSDN:
“DataItem属性仅在GridView控件的RowDataBound事件期间和之后可用。”
因此,访问RowDataBound事件中的DataItem:
假设您将List(Of Vehicle)绑定到网格:
Dim vehicles As List(Of Vehicle) = Vehicle.GetAll()
gvVehicles.DataSource = vehicles
gvVehicles.DataBind()
在RowDataBound事件中访问DataItem:
Protected Sub gvVehicles_RowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim veh As Vehicle = TryCast(e.Row.DataItem, Vehicle)
If Not veh Is Nothing Then
Dim chkBox As CheckBox = CType(e.Row.FindControl("chkSelect"), CheckBox)
chkBox.Checked = True
End If
End If
End Sub