访问用于绑定gridview的数据或dataItem

时间:2011-08-17 09:44:51

标签: c# asp.net gridview dataitem

我有一个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?

2 个答案:

答案 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