【问题标题】:GridView with checkbox column. Client-side script to uncheck all except current checkbox带有复选框列的 GridView。客户端脚本取消选中除当前复选框之外的所有复选框
【发布时间】:2010-06-29 21:18:23
【问题描述】:

我正在将类型化列表动态绑定到 GridView 控件。 网格视图控件位于一个 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 事件处理程序上注册 - 如下:

if (!Page.ClientScript.IsClientScriptBlockRegistered("ErrorsCheckBoxHandler")) Page.ClientScript.RegisterClientScriptBlock(GetType(),"ErrorsCheckBoxHandler", "function errorCheckChanged() {window.alert(\"here\"); }");

问题是当任何复选框被点击时该函数没有被调用。希望有人可以阐明我在这里缺少什么?

此外,取消选择目标列中选中的任何其他复选框的最佳方法是什么?

我的计划是将“errorCheckChanged”函数更改为采用一个参数(复选框对象)。我会更改上面的代码;添加到属性添加签名:

checkBox.Attributes.Add("CheckedChanged", "errorCheckChanged(this)");

希望我能够:
(1) 判断复选框状态是否为'checked'。 (如果已“选中”,则继续执行以下步骤)
(2)找到checkbox parent(=cell),然后确定受影响的GridView Row。
(3) 遍历所有行,将复选框设置为“Checked=false”,当前行除外。

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

谢谢

授予

【问题讨论】:

    标签: asp.net javascript asp.net-ajax


    【解决方案1】:

    您还可以在设计时添加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;
        }
    }
    

    【讨论】:

    • 好东西塞尔瓦。遵循这个概念是有效的。除了,我无法让 - getElementById('' 工作。我必须对值进行硬编码。感谢您的帮助。
    • 这不允许多选复选框。如何启用多重检查?
    • @rickyProgrammer OP 要求是选中选中的CheckBox 并取消选中剩余的。如果要进行多次检查,请使用此选项。 function errorCheckChanged(){ var gridView = document.getElementById('&lt;% =GridView1.ClientID %&gt;'); var Elements = gridView.getElementsByTagName('input'); for(var i = 0; i &lt; Elements.length; i++){ if(Elements[i].type == 'checkbox' &amp;&amp; !chkBox.checked) Elements[i].checked = true; } }
    • 我也尝试不在建议的原始代码中包含 for 循环部分,并且它有效。你认为我做的是对的还是会影响某些事情?
    【解决方案2】:

    使用onclick 属性而不是CheckChanged。我不认为这是一个有效的 js 事件。所以

    checkBox.Attributes.Add("onclick", "errorCheckChanged(this);");
    

    获取您可以执行的复选框列表

    js:

    var grid = document.getElementById('<% =GridView1.ClientID %>');
    var checks = grid.getElementsByTagName('input');
    

    您必须检查type 属性以确保它是一个复选框,或者您可以为所有复选框指定一个特定的类以对它们进行逻辑分组。无论如何,您可以对照列表检查您的 clicked 元素 ID。

    【讨论】:

    • 感谢您的快速回复。我的第一次尝试是使用“onclick”事件。只有在注册脚本块时输入的详细信息才能通过浏览器中的 View -> Source 查看。即使我能够触发事件(当使用实际列(而不是列中的复选框)注册 onclick 事件时,源也不会显示每一行的属性。我认为这是因为 UpdatePanel 加密了信息。
    • 通常您在查看源代码时看到的是最初加载的内容。之后将不会应用任何 javascript 更改。如果你使用的是 IE8,你可以打开开发者工具窗口(f12),它会给你一个 html 视图,在 ajax 请求完成后你可以刷新 html 内容(f5)。
    • 我移除了面板以便查看 Htlm。我没有想过在开发者工具窗口中刷新 html 视图。谢谢你的提示。将来会这样做
    猜你喜欢
    • 2013-01-22
    • 2011-02-25
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多