GridView RowDataBound не срабатывает при обратной передаче

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

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

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

У вас есть сетка внутри ajax UpdatePanel? Это может быть обратная передача.

Ricardo Villamil 12.11.2008 00:14

Нет, на этой странице нет UpdatePanels.

Ryan Lundy 12.11.2008 00:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
17 769
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

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

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

Visible='<%#ShowParentLink()%>'

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

Кроме того, RowDataBound данных не срабатывает, потому что вы не выполняете привязку данных. Вы перестраиваете страницу из состояния просмотра - "привязка состояния просмотра" из-за отсутствия лучшего слова.

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

Ответ принят как подходящий

Вот как я решил это:

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

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

void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}

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

Но, к сожалению, e.Row.DataItem имеет значение NULL для RowCreated, тогда как значение NULL для RowDataBound :(

dlchambers 05.02.2020 06:01
protected void btnHazardRating_Click(object sender, EventArgs e)
{
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);

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

}

Добро пожаловать на SO, здесь рекомендуется объяснить, почему использовать ваше решение, а не только как. Это сделает ваш ответ более ценным и поможет дальнейшему читателю лучше понять, как вы это делаете. Я также предлагаю вам взглянуть на наш FAQ: stackoverflow.com/faq.

ForceMagic 26.10.2012 08:51

Другие вопросы по теме