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 it 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 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.