Ячейка GridView не регистрирует никаких элементов управления в событии RowCommand

Во-первых, я понимаю, что большую часть этого можно сделать и с помощью ItemTemplates. Если то, что я пытаюсь сделать, просто невозможно, я рассмотрю возможность их использования.

Вот основы моей дилеммы:

У меня есть GridView на странице ASPX, которая загружается в CodeBehind. Каждая строка содержит пару кнопок, которые вызывают событие OnRowCommand. Когда кто-то нажимает кнопку «Изменить», я создаю объект TextBox и добавляю его в коллекцию элементов управления определенной ячейки.

Это прекрасно работает.

Проблема в том, что когда человек нажимает кнопку «Сохранить», OnRowCommand снова запускается, но ячейка регистрирует 0 элементов в коллекции элементов управления. Я почти уверен, что это происходит до PostBack, поэтому я не уверен, почему я не могу получить доступ к элементу управления TextBox.

Я проверил после первоначального добавления TextBox, и он показывает 1 элемент управления в ячейке. Где-то между загрузкой страницы с текстовыми полями и нажатием кнопки эти элементы управления пропали. Гугл не сильно помог. Любые идеи?


person beardog    schedule 17.06.2009    source источник


Ответы (4)


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

person epitka    schedule 17.06.2009
comment
Я не понимал, что элементы управления теряются в постбэке. В итоге я просто получил нужные мне значения из объекта Request.Form. Все еще хотелось бы, чтобы было немного проще увековечить элементы управления, не создавая TemplateFields для всего. - person beardog; 17.06.2009

Когда пользователь нажимает кнопку редактирования, вы находитесь в режиме редактирования GridView. Это тоже надо настроить?

person BenB    schedule 17.06.2009

Если вы создаете элементы управления «на лету», они всегда будут исчезать при обратной передаче, а это означает, что вам придется продолжать создавать их в каждом цикле.

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

person TheTXI    schedule 17.06.2009

Вы можете создать обработчик добавления с делегатом при создании кнопки за кодом. обработчик сработает до того, как сработает команда row.

 Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

Dim btnsave As New ImageButton
If e.Row.RowType <> DataControlRowType.Pager And e.Row.RowType <>  DataControlRowType.Header Then
    AddHandler btnedit.Click, AddressOf btnedit_Click
    GridView1.Rows(i).Cells(8).Controls.Add(btndel)
end if

end sub

Public Delegate Sub ImageClickEventHandler(ByVal sender As Object, ByVal e As ImageClickEventArgs)
Sub btnedit_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs)

//do whatever you want here.
//possibly a redirect to the current page so nothing else fires

end sub
person Eric    schedule 17.06.2009
comment
Я ценю пример кода, но в итоге я нашел другое решение. Спасибо. - person beardog; 17.06.2009