Помощь с DataGrid/CheckBoxes/двойной отправкой

У нас есть простой датагрид. В каждой строке есть флажок. Для флажка установлена ​​автоматическая отправка, а в коде программной части есть обработчик событий для события checkbox check-changed. Это все работает как положено, ничего сложного.

Тем не менее, мы хотим отключить флажки, как только один из них будет отмечен, чтобы предотвратить двойную отправку, т. Е. Флажок установлен, все флажки отключены через 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-changed, даже если флажок отключен?


person Gareth D    schedule 10.02.2009    source источник


Ответы (4)


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

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

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

person Andy Rose    schedule 10.02.2009
comment
Привет, Энди - да, флажок, который был установлен, также необходимо отключить. - person Gareth D; 10.02.2009

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

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

person Gareth D    schedule 10.02.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; 
       }
   );
}
person Mark Brackett    schedule 29.07.2009

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

(размещение образца на С#, но я надеюсь, что он не будет сильно отличаться от 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;

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

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

person Nikos Steiakakis    schedule 10.02.2009