0

我们有一个简单的数据网格。每行都有一个复选框。复选框设置为自动回发,并且代码隐藏具有复选框选中更改事件的事件处理程序。这一切都按预期工作,没有什么复杂的。

但是,我们希望在选中复选框后立即禁用复选框以防止重复提交,即选中复选框,通过客户端 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 事件?

4

4 回答 4

0

我自己没有对此进行测试,但是当您调用“DisableAllDataGridCheckBoxes”方法时,是否需要禁用已选中的复选框?如果没有,您可以传递调用复选框的 id,然后只禁用所有其他复选框。

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

我认为这将允许服务器端代码触发。

于 2009-02-10T10:56:13.163 回答
0

服务器端事件未触发的原因是禁用的复选框不会与表单的其余部分一起提交。

我使用的解决方法是将复选框的 onclick 事件设置为 null 而不是禁用它们 - 虽然这不会为用户提供后续点击被忽略的视觉线索,但它确实阻止了双重提交,并且复选框被设置为顶部呈现响应时的正确状态。

于 2009-02-10T11:53:20.390 回答
0

不要禁用复选框(然后不会提交),只需“阻止”它们被选中。通过更改其 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; 
       }
   );
}
于 2009-07-29T11:27:08.913 回答
-1

一种可能的解决方法是在数据网格的 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;

如果您只想禁用特定项目。

但是,如果您只想在客户端代码中实现这一点,那将无济于事。

于 2009-02-10T11:08:18.377 回答