2009-06-08 2 views
3

У меня есть Gridview с AutoGenerateColumns="False".
Я использую TemplateField для отображения моих кнопок Edit, Update и Cancel в первом столбце GridView в соответствующих полях ItemTemplate и EditItemTemplate.Gridview RowUpdating event not firing

Внутри ItemTemplate у меня есть ImageButtong с CommandName "Edit". Это работает так, как ожидалось, и я могу установить точку останова в обработчике событий RowCommand, чтобы увидеть имя команды «Событие». После того, как он был нажат, postback помещает эту строку в режим редактирования. Все текстовые поля отображаются так, как они предназначены.

На данный момент указанный выше EditItemTemplate отображается с двумя ImageButtons внутри него. У одного есть CommandName = "Update", а другой - «Отмена».

Моя проблема заключается в том, что щелчок на Update ImageButton отправляется обратно, но ни события RowCommand, ни RowUpdating не запускаются.

Я установил требуемые атрибуты в теге GridView. (Обратите внимание, что в GridView EnableViewState="False" - если я установить его Правда я получаю стандартный

«Не удалось загрузить ViewState дереве управления ....» И т.д. ошибка)

Один странный что я заметил, что заставляет меня думать, что проблема ViewState заключается в том, что если я изменил кнопку CommandName кнопки Update на «Edit», то событие postback будет зафиксировано в событии RowCommand ...

Любые предложения приветствуются , Благодарю.

+0

У кого-нибудь есть образец, где они заменили CommandField (встроенные кнопки для функций GridView) со своими собственными TemplateFields для редактирования? – Sean

+0

Взрыв! Я только что вспомнил, что мне нужно решение TemplateField, поскольку у меня также есть строка Insert в нижнем колонтитуле, и мне нужно, чтобы FooterTemplate содержал ImageButton ... потянув мои волосы здесь! Пожалуйста, проигнорируйте сам ответ ниже, если он не был удален. – Sean

ответ

1

Я устранило главную страницу и пусть страница, содержащая GridView, наследуется от страницы, и она сработала. Что-то в моем стеке наследования (или что-то в элементах управления MS) не срабатывало так, как я его настраивал.

0

Если вы измените имя команды на «обновление», вам придется обрабатывать обновление в команде строки, что не должно быть проблемой - не так ли?

Check out this Question I asked. It may help

Добавлено
Что вы можете сделать, это изменить имя_команды все, что вы хотите, и обрабатывать его в Rowcommand. Сделайте обновление/вставку базы данных вручную в командной строке.

+0

Привет Эрик - к сожалению, RowCommand не запускается, когда Update ImageButton имеет его CommandName как что-то иное, чем «Редактировать» ... Я не думаю, что EditItemTemplate ImageButtons создаются для обратной передачи, чтобы зарегистрировать их, чтобы их события не были " t поднят - либо это, либо gridview перевязывается, и они теряются. В идеале я ищу полный рабочий образец, где есть настроенные кнопки, используемые для этого типа сценария. – Sean

+0

ОК. Подожди. Я помогу тебе. – Eric

+0

Спасибо Эрик. Я думал, что у меня есть решение (см. «Ответ» ниже), но понял, что мне нужен TemplateFields вместо CommandField, поскольку у меня есть строка вставки в нижнем колонтитуле. Пожалуйста, проигнорируйте ответ ниже ... – Sean

1

Шон,

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

// Это в PageLoad

If Not IsPostBack Then 
     'Create new column for Edit buttons 
     'Dim field As New TemplateField 
     Dim actionfield As New TemplateField 


     actionfield.HeaderText = "Action" 
     Dim actioncol As DataControlField = actionfield 
     GridView1.Columns.Insert(8, actioncol)//the eight is the column number of where you are adding the column. below you will add the button. You really don't need to add this column programmtically. I normally do though. 

    End If 

// rowcreated

If e.Row.RowType <> DataControlRowType.footer Then 
      btnedit.ToolTip = "Edits the Current Record" 
      btnedit.ImageUrl = "\images\bttnEditMini.gif" 
      GridView1.Rows(i).Cells(8).Controls.Add(btnedit) 
      btnedit.CommandName = "view"//notice commandname. You can manipulate it. 
      btnedit.CommandArgument = GridView1.Rows(i).Cells(0).Text 
      AddHandler btnedit.Click, AddressOf btnedit_Click 
end if 

// обратите внимание на то вы должны создать imageclickeventhandler делегат

Public Delegate Sub ImageClickEventHandler(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
Sub btnedit_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
//whatever actions you need to take. 

end sub 
+0

Приветствия за это, Эрик. Вы, наверное, уже поняли, что я ошибался, думая, что у меня есть ответ :( Сейчас здесь. Мне нужно вернуться к вашему завтрашнему завтраку. Спасибо за помощь. Шон – Sean

+0

Без проблем Шон! это помогает! – Eric

1

Это исправили проблему для меня:

If Not Master.Page.IsPostBackEventControlRegistered Then 

     'logic to bind data 

    End If 
0

У меня также есть та же проблема в Gridview с Edit, обновление, отмена. Отменить и отменить событие уволить, но никогда не обновлять событие. Затем, наконец, я изменяю значение CauseValidation на значение false для параметра «Обновить ссылку» в поле «Изменить шаблон». Это удивительно прекрасно работает.

7

Как отметил Асем и Рон, добавление атрибута CausesValidation = "false" в CommandField разрешило проблему. Причина в том, что у меня были некоторые другие элементы проверки на странице, а в обновлении GridView страница запускала другие элементы проверки, поэтому я считаю, что лучше установить свойство ValidationSummary.

1

Установите для свойства GridView EnableViewState значение true.

+0

Я обнаружил, что отключенное ViewState на странице также заблокировало событие RowUpdating. – Rolf

0

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

  1. Найти валидаторы, не входящие в шаблон элемента редактирования этой строки сетки, установить их в page_load.
  2. Let 'CausesValidation' остается верным в командных полях шаблона (по умолчанию это правда, поэтому вы можете просто удалить его.), Чтобы все в строке, которую вы хотите проверить, все еще проверяется.
  3. Прибыль.
4

У меня была такая же ситуация, когда моя кнопка «Изменить» вызывала другие проверки (хотя и скрытые всплывающие окна) для выполнения за сценой.

От чтения решений я искал стандартное свойство CausesValidation="false", чтобы исправить проблему. Мне не удалось найти это поле, потому что кажется, что я использовал AutoGenerateEditButton="True", чтобы добавить свои кнопки редактирования в gridview.

Мое решение было следующим, и я надеюсь, что это поможет вам сэкономить и ценное время.

  1. AutoGenerateEditButton="False" Таким образом вы можете добавить это поле, используя код ASP.

  2. Используйте приведенный ниже код, чтобы добавить поле кнопки «Редактировать» в свой код gridView следующим образом.

    <asp:commandfield showeditbutton="true" causesvalidation="false" headertext="Edit"/> 
    

Если проверка была проблема, вы бы сейчас видеть ваш модуль обновления обжиг в axpected.

0

Если вы используете какую-либо функцию для извлечения (привязки) вида сетки из базы данных и вызова ее в page_Load() событиях, это может вызвать эту проблему. попробуйте вызвать эту функцию в событии page_LoadComplete() и он будет работать.