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?
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 theDataItem
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 namedItemId
indicating the key for your object then you can useDataKeyNames="ItemId"
in the markup and refer it inOnRowDeleting
using Keys property of event arguments.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:
In the RowDataBound event access the DataItem: