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





Я ожидал, что состояние просмотра также отразит тот факт, что вы удалили некоторые ссылки (при условии, что они были удалены до сохранения состояния просмотра).
Может быть, это вопрос, который вам нужно задать: «Почему удаленные ссылки все еще отображаются в состоянии просмотра?».
1) У вас может быть метод - ProcessDataRows (), который будет вызываться один раз в grid_DataBound (...). И тогда, когда он вам понадобится, после PostBack.
И таким образом вы обрабатываете все строки, когда хотите.
2) У вас могут быть такие методы, как ShowParentLink (). Затем они привязываются к LinkButton в сетке (если вы используете ItemTemplate), и ссылка будет иметь
Visible='<%#ShowParentLink()%>'
Страница не может обрабатывать события обратной передачи, если она не будет перестроена точно, как это было раньше (обратная передача). Если вы повторно скрываете свои ссылки во время инициализации страницы, ваши события щелчка и тому подобное должны срабатывать. К сожалению, не видя примера кода, я не могу уточнить детали.
Кроме того, RowDataBound данных не срабатывает, потому что вы не выполняете привязку данных. Вы перестраиваете страницу из состояния просмотра - "привязка состояния просмотра" из-за отсутствия лучшего слова.
Другое решение - поместить логику в запрос LINQ, чтобы получить логическое поле LINQ, например ShowParentLink. Затем вы можете просто привязать свойство Visible поля HyperLink к этому значению - RowDataBound не требуется.
Вот как я решил это:
LinkVisibility.LinkVisibility в коллекцию для каждой строки.LinkVisibility для каждого по PK в коллекции (DataKeyNames задается в GridView) и соответствующим образом устанавливаю ссылки.Я не знаю, что это лучший способ сделать это, но он определенно работает, и это больше, чем я могу сказать обо всем остальном, что я пробовал.
void Process Rows()
{
... do something
... process complete
datagrid.DataBind();
}
Событие RowDataBound срабатывает только при изменении данных GridView во время обратной передачи. Событие закорочено из-за скорости, поэтому оно не создает без надобности одни и те же данные. Вместо этого используйте событие RowCreated для управления HTML - оно запускается при каждой обратной передаче независимо от того, изменились ли данные.
Но, к сожалению, e.Row.DataItem имеет значение NULL для RowCreated, тогда как значение NULL для RowDataBound :(
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.
У вас есть сетка внутри ajax UpdatePanel? Это может быть обратная передача.