GridView RowDataBound не срабатывает при обратной передаче - PullRequest
6 голосов
/ 11 ноября 2008

На странице ASP.NET у меня есть GridView, заполненный результатами запроса LINQ. Я устанавливаю DataSource в коде, затем вызываю DataBind для него. В событии RowDataBound GridView я выборочно скрываю ссылки в некоторых полях GridView на основе результатов запроса. (Например, я скрываю, что ссылка «Показать родителей» рассматриваемой строки не имеет родительской строки.)

Это отлично работает изначально. Но при обратной передаче (когда я не вызываю DataBind, но GridView остается заполненным через ViewState), данные отображаются, но событие RowDataBound (очевидно) не срабатывает, и мои ссылки не получают скрытый.

Какой лучший способ скрыть ссылки после обратной передачи?

Ответы [ 8 ]

2 голосов
/ 13 ноября 2008

Вот как я решил эту проблему:

  1. Я создал сериализуемый класс с доступными только для чтения свойствами: PK строки и логическое значение для каждой ссылки, указывающее, включена ли она или нет. Мы назовем это LinkVisibility.
  2. Я создал сериализуемый класс, унаследованный от KeyedCollection для хранения экземпляров указанного выше класса.
  3. Я создал свойство ViewState-backed, содержащее экземпляр этой коллекции.
  4. В моей процедуре поиска (заполняющей GridView) я очищаю коллекцию.
  5. В RowDataBound, который изначально показывает / скрывает ссылки, я добавляю экземпляр LinkVisibility в коллекцию для каждой строки.
  6. В Page.Load, когда IsPostBack имеет значение true, я перебираю строки GridView. Я смотрю LinkVisibility для каждого по PK в коллекции (DataKeyNames устанавливается в GridView), и я устанавливаю ссылки соответственно.

Я не знаю, что это лучший способ сделать это, но он, безусловно, работает, что больше, чем я могу сказать для всего, что я пробовал.

2 голосов
/ 26 октября 2011

Событие RowDataBound возникает только при изменении данных GridView во время обратной передачи. Событие имеет короткое замыкание на скорость, поэтому оно не создает ненужные повторные данные. Вместо этого используйте событие RowCreated для манипулирования HTML - оно запускается при каждой обратной передаче независимо от того, изменились ли данные.

1 голос
/ 11 ноября 2008

1) У вас может быть метод - ProcessDataRows (), который будет вызван один раз для grid_DataBound (...). А потом, когда вам это нужно после PostBack.

И таким образом вы обрабатываете все строки, когда хотите.

2) У вас могут быть такие методы, как ShowParentLink (). Затем они привязываются к LinkButton в сетке (если вы используете ItemTemplate) и ссылка будет иметь

Visible='<%#ShowParentLink()%>'
0 голосов
/ 30 марта 2012
protected void btnHazardRating_Click(object sender, EventArgs e)
{
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);

    gvPanelRole.DataSource = dtGo;
    gvPanelRole.DataBind();
    ModalPopup.Show();

}
0 голосов
/ 05 февраля 2009
void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}
0 голосов
/ 12 ноября 2008

Другое решение состоит в том, чтобы поместить логику в запрос LINQ, чтобы в итоге вы получили логическое поле LINQ, например «ShowParentLink». Затем вы можете просто привязать свойство Visible поля HyperLink к этому значению - RowDataBound не требуется.

0 голосов
/ 11 ноября 2008

Страница не может обрабатывать события обратной передачи, пока она не будет перестроена точно , как это было раньше (обратная передача). Если вы повторно скрываете свои ссылки во время инициализации страницы, ваши события кликов и тому подобное должны срабатывать. К сожалению, не увидев пример кода, я не могу получить более конкретный.

Также данные RowDataBound не запускаются, потому что вы не привязываете данные. Вы перестраиваете страницу из представления состояния - «привязка состояния представления» из-за отсутствия лучшего слова.

0 голосов
/ 11 ноября 2008

Я ожидал, что состояние просмотра также будет отражать тот факт, что вы удалили некоторые ссылки (при условии, что они были удалены до сохранения состояния просмотра).

Может быть, это вопрос, который вам нужно задать, «почему удаленные ссылки все еще появляются в viewstate?».

...