【问题标题】:Accessing the data or dataItem used to bind a gridview访问用于绑定gridview的数据或dataItem
【发布时间】:2011-08-17 09:44:51
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不能使用 var dataItem = MyGridView.Rows[e.RowIndex].DataItem;这将起作用。
  • 我尝试使用它,但我得到了 null。
  • MyItem 集合是什么?类型和字段?
  • @Teletha, var row = MyGridView.Rows[e.RowIndex];然后你应该有一个单元格列表。您可以从行中提取单元格。
  • @Jethro 它是空的。也许这是一个回发问题?

标签: c# asp.net gridview dataitem


【解决方案1】:

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

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

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

【讨论】:

  • ViewState 没有被使用,但是其他的东西保存在 Session 状态。要使用 DataKeyNames,属性必须是可序列化的吗?
  • @teletha,实际数据键值存储在控制状态(或视图状态)中,所以是的,您的键属性类型必须是 serializable。但大多数情况下,您的关键属性将是 int、string、guid 的组合,并且这些属性已经被标记为可序列化。
  • 我明白了!这些键值是被绑定的 DataItem 的属性还是我如何设置/获取这些?我可以给 ItemTemplete 中的一行命名吗?
  • @Teletha,假设您将网格与“MyItem”类型的对象集合绑定,并且如果此类具有名为“ItemId”的属性,那么您必须在 gridview 级别设置 DataKeyNames="ItemId" 然后GridViewDeleteEventArgsKeys 属性对于绑定到要删除的行的对象将具有此属性的值。
  • 据我所知,DataKeyNamesDataItem 的原因相同 - 只有在生命周期中网格为DataBound 时才可用,这不是回发.
【解决方案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

【讨论】:

  • 这在尝试处理 OnRowDeleting 时几乎没有帮助。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多