我们有一个简单的数据网格。每行都有一个复选框。该复选框设置为autopostback,代码隐藏有一个复选框检查更改事件的事件处理程序。这一切都按预期工作,没有什么复杂的。
但是,我们要在选中一个复选框时禁用复选框,以防止双重提交,即选中复选框,所有复选框都通过客户端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 :(得分:0)
我自己没有对此进行测试,但是当您调用'DisableAllDataGridCheckBoxes'方法时,是否需要禁用已选中的复选框? 如果没有,您可以传递调用复选框的id,然后只禁用所有其他复选框。
chk.Attributes.Add("onclick", "alert('fired ...');DisableAllDataGridCheckBoxes(" + chk.ClientId + ");")
我认为这会允许服务器端代码触发。
答案 1 :(得分:0)
服务器端事件未触发的原因是禁用的复选框不会与表单的其余部分一起提交。
我使用的解决方法是将复选框的onclick事件设置为null而不是禁用它们 - 虽然这不会给用户提供后续点击被忽略的视觉线索,但它会阻止双重提交和复选框在呈现响应时设置正确的状态。
答案 2 :(得分: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;
}
);
}
答案 3 :(得分:-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;
如果您只想禁用特定项目。
但是,如果您只想在客户端代码中实现此功能,则无法帮助您。