Помощь с DataGrid / CheckBoxes / двойная отправка - PullRequest
0 голосов
/ 10 февраля 2009

У нас есть простая таблица данных. В каждой строке есть флажок. Флажок установлен на автостоп, а у выделенного кода есть обработчик события для события, помеченного флажком. Все работает как положено, ничего сложного.

Однако мы хотим отключить флажки, как только один из них будет установлен, чтобы предотвратить двойную отправку, т. Е. Установлен флажок, все флажки отключены через клиентский JavaScript, отправленная форма.

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

Protected Sub DgAccounts_ItemCreated(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DgAccounts.ItemCreated
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim chk As CheckBox = CType(e.Item.FindControl("chkItemChecked"), CheckBox)            
        chk.Attributes.Add("onclick", "alert('fired ...');DisableAllDataGridCheckBoxes();")
    End If
End Sub

При проверке источника отображаемой страницы мы получаем следующее:

<input id="DgAccounts__ctl2_chkItemChecked" type="checkbox" name="DgAccounts:_ctl2:chkItemChecked" onclick="alert('fired ...');DisableAllDataGridCheckBoxes();setTimeout('__doPostBack(\'DgAccounts$_ctl2$chkItemChecked\',\'\')', 0)" language="javascript" />

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

Могу ли я заставить событие check-change срабатывать, даже если флажок отключен?

Ответы [ 4 ]

0 голосов
/ 29 июля 2009

Вместо того, чтобы отключить флажки (которые затем не будут отправлены), просто «запретите» их выбор. Сделайте это, изменив их обработчик onclick, чтобы сбросить проверенное состояние. Вы можете установить все остальные флажки на отключенные и сделать это только для того, который обрабатывает. Что-то вроде:

function stopChanges(cbCurrent) {
   $('INPUT[type=checkbox]').disable(); // disable all checkboxes

   $(cbCurrent)
       .disable(false) // enable this checkbox, so it's part of form submit
       .click(function() {
           // reset to previous checked - effectively preventing change
           $(this).checked = !$(this).checked; 
       }
   );
}
0 голосов
/ 10 февраля 2009

Возможным обходным решением было бы сделать все это в коде стороны сервера RowCommand сетки данных.

(размещение образца в C #, но я надеюсь, что в VB он не будет сильно отличаться)

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if(((CheckBox)e.Item.FindControl("chkItemChecked")).Checked)
    {
        foreach(GridViewRow dvRow in myGrid.Rows)
             ((CheckBox)dvRow.FindControl("chkItemChecked")).Enabled = false;
   }
}

или вы можете использовать

((CheckBox)e.Item.FindControl("chkItemChecked")).Enabled = false;

, если вы хотите отключить только определенный элемент.

Однако, если вы хотите реализовать это только в коде на стороне клиента, это вам не поможет.

0 голосов
/ 10 февраля 2009

Причина, по которой событие на стороне сервера не запускается, состоит в том, что отключенные флажки не отправляются с остальной частью формы.

Обходной путь, который я использовал, - установить для события onclick флажков значение NULL, а не отключать их - хотя это не дает пользователю визуальной подсказки о том, что последующие нажатия игнорируются, оно предотвращает двойную отправку и флажки устанавливаются на верное правильное состояние при получении ответа.

0 голосов
/ 10 февраля 2009

Я сам не проверял это, но когда вы вызываете свой метод DisableAllDataGridCheckBoxes, вам нужно отключить установленный флажок? Если нет, вы можете передать идентификатор вызывающего флажка, а затем только отключить все остальные флажки.

chk.Attributes.Add("onclick", "alert('fired ...');DisableAllDataGridCheckBoxes(" + chk.ClientId + ");")

Я бы подумал, что это позволит запустить код на стороне сервера.

...