当前位置: 代码迷 >> JavaScript >> 带有复选框列的GridView。 客户端脚本取消选中除当前复选框以外的所有复选框
  详细解决方案

带有复选框列的GridView。 客户端脚本取消选中除当前复选框以外的所有复选框

热度:24   发布时间:2023-06-07 16:42:12.0

我动态地将类型列表绑定到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”(当前行除外)。

这会被认为是正确的方法吗?

谢谢

格兰特

您还可以在设计时添加checkboxonclick事件。

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

使用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。

  相关解决方案