Коллекция GridView DataKeys пуста, когда GridView находится в EditItemTemplate
Все,
К вашему сведению: я использую VS2005, .net 2.0.
У меня есть элемент управления GridView, который существует в FormView EditItemTemplate. К сожалению, GridView ведет себя неправильно в этой настройке, его коллекция DataKeys пуста, когда страница отправляется назад, и запускается команда select из gridview.
Вот последовательность событий:
- Пользователь переходит на страницу
- Пользователь нажимает "изменить" (FormView отображает EditItemTemplate там, где находится GridView)
- Пользователь нажимает кнопку поиска, которая выполняет обратную передачу еще раз, и заполняет GridView, расположенный в шаблоне EditItemTemplate (в этот момент GridView имеет DataKeys)
- Пользователь выбирает элемент из GridView, который вызывает строку выбранного события
- При обратной передаче запускается GridView RowCommand,- я проверяю, что CommandName = "select", и запускаю мой код, который выдает исключение, потому что коллекция DataKeys на данный момент пуста!
Еще одна дополнительная деталь: GridView живет в пользовательском элементе управления, который находится в EditItemTemplate FormView.
НОТА:
Я смог решить эту проблему, когда я переместил свой GridView из EditItemTemplate FormView,- теперь коллекция DataKeys НЕ пуста. К сожалению, GridView должен быть в EditItemTemplate, чтобы пользователь мог выбрать клиентов, которых он искал.
Любое понимание будет оценено.
Код обработки событий:
protected void ctlSearchResults_RowCommand(object sender, GridViewCommandEventArgs e)
{
// user has selected the client from the keyword search result list
if (e.CommandName == "select")
{
GridView searchResultsGrid = (GridView)e.CommandSource;
int selectedRowIndex = int.Parse((string)e.CommandArgument);
int clientId = (int)searchResultsGrid.DataKeys[selectedRowIndex][Client.PROP_ENTITYID];
// raise Selected event
_OnSelected(new ClientSelectedEventArgs(clientId));
}
}
3 ответа
Причина, по которой коллекция DataKey пуста, заключается в том, что вы обращаетесь к коллекции до привязки данных к сетке результатов поиска. Я считаю это руководство полезным при отладке порядка обработки проблем.
Я считаю, что вы хотите преобразовать отправителя в GridView следующим образом:
GridView searchResultsGrid = sender as GridView;
Попробуй это:
int selectedRowIndex = Convert.ToInt32(e.CommandArgument);
int clientId = Convert.ToInt32(this.yourGridView.DataKeys[selectedRowIndex]["yourDataKey"].Value);