2

我有一个gridview,我以编程方式设置数据源并将其数据绑定到对象集合。对于创建的每一行,然后我在字段中使用不同的方法从对象中提取相关信息,如下所示:

<asp:TemplateField HeaderText="Aliases">
<ItemTemplate>
<%# ( (MyItem)Container.DataItem).Aliases.ToString() %>
</ItemTemplate>
</asp:TemplateField>

我的问题是,在该OnRowDeleting方法中,我希望能够DataItem使用例如MyGridView.Rows[e.RowIndex].DataItem或其他方式访问该方法。但我找不到如何配置Gridview来保留DataItem. 是否可以访问DataItem使用的以及我将如何配置它来做到这一点?如果那不可能,我可以访问方法绑定的值吗?还是我必须使用计划 B 并将数据源对象集合重写为数据表,然后使用 datakeysnames?

4

2 回答 2

5

MyGridView.Rows[e.RowIndex].DataItem通常应该可以工作,但我猜您可能依赖视图状态在回发时保留网格数据。在这种情况下,您将获得DataItem属性为 NULL。

解决方法可以是在页面生命周期的早期(例如page_load)在每次回发中始终将网格与实际数据重新绑定。

但是,在您的情况下,您可以很好地使用DataKeyNames. 与您的看法相反,您不需要 DataTable 来使此属性起作用。例如,如果您的类具有ItemId指示对象键的属性,那么您可以DataKeyNames="ItemId"在标记中使用并在OnRowDeleting使用事件参数的Keys属性中引用它。

于 2011-08-17T10:18:29.507 回答
1

根据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
于 2014-06-23T09:09:47.803 回答