Доступ к данным или dataItem, используемому для привязки вида сетки - PullRequest
0 голосов
/ 17 августа 2011

У меня есть сетка, для которой я программно устанавливаю источник данных и привязываю его к коллекции объектов.Для каждой созданной строки я затем использую различные методы в полях для извлечения соответствующей информации из объекта, подобного этому:

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

Моя проблема заключается в том, что в методе OnRowDeleting мне бы хотелось иметь возможностьчтобы получить доступ к этому DataItem, используя, например, MyGridView.Rows [e.RowIndex] .DataItem или другим способом.Но я не могу найти, как настроить Gridview для сохранения DataItem. Возможно ли получить доступ к используемому DataItem и как я могу настроить его для этого? Если это невозможно, могу ли я получить доступ к значениям, которые связаны методами?Или мне нужно пойти с планом B и переписать коллекцию объектов источника данных в таблицу данных, а затем использовать имена ключей данных?

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

MyGridView.Rows[e.RowIndex].DataItem обычно должно работать, но я полагаю, что вы, вероятно, полагаетесь на состояние просмотра для сохранения данных сетки на постбеках. В этом случае вы получите свойство DataItem как NULL.

Обходной путь может заключаться в том, чтобы всегда повторно связывать сетку с фактическими данными в каждой обратной передаче в начале жизненного цикла страницы (скажем, page_load).

Однако, в вашем случае, вы очень хорошо можете использовать DataKeyNames. Вопреки вашему убеждению, вам не нужно DataTable, чтобы это свойство работало. Например, если у вашего класса есть свойство с именем ItemId, указывающее ключ для вашего объекта, вы можете использовать DataKeyNames="ItemId" в разметке и ссылаться на него в OnRowDeleting, используя Keys свойство аргументов события.

2 голосов
/ 23 июня 2014

Согласно MSDN :

"Свойство DataItem доступно только во время и после события RowDataBound элемента управления GridView."

Следовательно, доступ к DataItem осуществляется всобытие RowDataBound:

Допустим, вы связываете список (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
...