2009-02-10 67 views
0

我们有一个简单的数据网格。每一行都有一个复选框。该复选框设置为autopostback,并且代码隐藏具有复选框检查更改事件的事件处理程序。这一切都按预期工作,没有什么复杂的。帮助DataGrid/CheckBoxes /双提交

但是,我们希望在检查一个选项以禁止双重提交,即复选框选中时禁用复选框,所有复选框都将通过客户端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" /> 

这一切都出现在顺序,但是服务器端事件不火 - 我相信这是由于该复选框被禁用,因为如果我们只是留在警报和解除呼叫保留禁用复选框它一切正常。

即使复选框被禁用,我是否可以强制启用检查更改事件?

回答

0

我自己没有测试过这个,但是当你调用你的'DisableAllDataGridCheckBoxes'方法时,你需要禁用已经检查过的复选框吗? 如果不是,您可以传递调用复选框的ID,然后只禁用所有其他复选框。

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

我想这会允许服务器端代码触发。

+0

嗨安迪 - 是的复选框被选中也需要被禁用。 – 2009-02-10 19:35:01

-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; 

如果只想禁用特定项目。

但是,如果你只想在客户端代码中实现这一点,它不会帮助你。

+0

需要成为客户端。 – 2009-02-10 19:35:43

0

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

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

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; 
     } 
    ); 
}