问题描述
我动态地将类型列表绑定到GridView控件。 Grid View控件位于asp.net页面中,该页面包装在asp:UpdatePanel(Ajax)中。 第一列包含一个复选框控件。 在此列中只能选中一个复选框。 如果用户选中了一个复选框,则必须取消选中所有其他复选框。
我正在尝试使用客户端脚本来实现此目标,但没有成功。 在GridView的RowDatabound事件的处理程序中,试图将属性添加到单元格中包含的CheckBox中。
protected void ErrorGridView_RowDatabound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if(e.Row.Cells[0].HasControls())
{
foreach (var control in e.Row.Cells[0].Controls)
{
if (!(control is CheckBox)) continue;
var checkBox = (CheckBox)control;
checkBox.Attributes.Add("CheckedChanged", "errorCheckChanged");
return;
}
}
}
客户端脚本已在Page_Load事件处理程序上注册-如下所示:
如果(!
问题在于,单击任何复选框后,不会调用该函数。 希望有人可以阐明我在这里想念的东西吗?
另外,对目标列中选中的所有其他复选框取消选择的最佳方法是什么?
我的计划是将“ errorCheckChanged”功能更改为采用一个参数(复选框对象)。 我将更改上面的代码; 在属性添加签名中添加:
checkBox.Attributes.Add(“ CheckedChanged”,“ errorCheckChanged( this )”);
希望我能够:
(1)确定复选框状态是否为“已选中”。
(如果已选中,则继续执行以下步骤)
(2)找到复选框父项(=单元格),然后确定受影响的GridView行。
(3)遍历所有行,将复选框设置为“ Checked = false”(当前行除外)。
这会被认为是正确的方法吗?
谢谢
格兰特
1楼
您还可以在设计时添加checkbox的onclick事件。
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" onclick="errorCheckChanged(this)" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
JavaScript看起来像
function errorCheckChanged(chkBox){
var gridView = document.getElementById('<% =GridView1.ClientID %>');
var Elements = gridView.getElementsByTagName('input');
for(var i = 0; i < Elements.length; i++){
if(Elements[i].type == 'checkbox' && Elements[i].id != chkBox.id && chkBox.checked)
Elements[i].checked = false;
}
}
2楼
使用onclick属性而不是CheckChanged 。
我认为这不是有效的js事件。
所以
checkBox.Attributes.Add("onclick", "errorCheckChanged(this);");
获取复选框列表,您可以执行
js:
var grid = document.getElementById('<% =GridView1.ClientID %>');
var checks = grid.getElementsByTagName('input');
您必须检查type属性以确保它是一个复选框,或者可以为所有复选框提供特定的类以对其进行逻辑分组。
无论如何,您都可以对照列表检查click ed元素ID。