Accessing the data or dataItem used to bind a grid

2019-09-09 22:45发布

I have a gridview for which I programmatically set the datasource and databind it to a collection of objects. For each row that is created I then use different methods in the fields to extract the relevant information from the object like this one:

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

My problem is that in the OnRowDeleting method I would preferably like to be able to access that DataItem using e g MyGridView.Rows[e.RowIndex].DataItem or in other way. But I can’t find how to configure the Gridview to retain the DataItem. Is this possible to access the DataItem used and how would I configure it to do it? If that’s not possible can I access the values that are bind by the methods? Or do I have to go with plan B and rewrite the datasource object collection to a datatable and then use datakeysnames?

2条回答
▲ chillily
2楼-- · 2019-09-09 23:29

MyGridView.Rows[e.RowIndex].DataItem should generally work but I guess that you are probably relying the view-state for retaining grid data on post-backs. In such case, you will get the DataItem property as NULL.

Work-around can be to always re-bind the grid with actual data in each postback early in page life cycle (say page_load).

However, in your case, you can very well use DataKeyNames. Contrary to your belief, you don't need a DataTable for this property to work. For example, if your class has property named ItemId indicating the key for your object then you can use DataKeyNames="ItemId" in the markup and refer it in OnRowDeleting using Keys property of event arguments.

查看更多
Rolldiameter
3楼-- · 2019-09-09 23:52

According to MSDN:

"The DataItem property is only available during and after the RowDataBound event of a GridView control."

Therefore, access the DataItem in the RowDataBound event:

Lets say you bind a List(Of Vehicle) to the grid:

Dim vehicles As List(Of Vehicle) = Vehicle.GetAll()
gvVehicles.DataSource = vehicles
gvVehicles.DataBind()

In the RowDataBound event access the 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
查看更多
登录 后发表回答