Коллекция GridView DataKeys пуста, когда GridView находится в EditItemTemplate

Все,

К вашему сведению: я использую VS2005, .net 2.0.

У меня есть элемент управления GridView, который существует в FormView EditItemTemplate. К сожалению, GridView ведет себя неправильно в этой настройке, его коллекция DataKeys пуста, когда страница отправляется назад, и запускается команда select из gridview.

Вот последовательность событий:

  1. Пользователь переходит на страницу
  2. Пользователь нажимает "изменить" (FormView отображает EditItemTemplate там, где находится GridView)
  3. Пользователь нажимает кнопку поиска, которая выполняет обратную передачу еще раз, и заполняет GridView, расположенный в шаблоне EditItemTemplate (в этот момент GridView имеет DataKeys)
  4. Пользователь выбирает элемент из GridView, который вызывает строку выбранного события
  5. При обратной передаче запускается 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);
Другие вопросы по тегам