【问题标题】:How to check all checkboxes on a page?如何检查页面上的所有复选框?
【发布时间】:2009-08-30 04:43:55
【问题描述】:

我正在尝试检查位于母版页内的网络表单 (aspx) 页面上的所有复选框,具体取决于复选框的 ID。复选框是动态创建的,所以我只知道找到它的前缀。所以,我需要通过某种方式迭代页面上的控件来找到这些复选框。

下面是应该进行检查的代码:

Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
    Dim oCheckbox As System.Web.UI.WebControls.CheckBox = Nothing
    Dim oControl As Control = Nothing
    For Each oControl In Me.Controls
        If oControl IsNot Nothing Then
            If TypeOf oControl Is System.Web.UI.WebControls.CheckBox Then
                oCheckbox = oControl
                If oCheckbox.Text.StartsWith("ClientCheckBox_") Then
                    oCheckbox.Checked = True
                End If
            End If
        End If
    Next
End Sub

【问题讨论】:

  • 看到人们去服务器做这个让我很痛苦...... :(
  • 除了痛,你有什么建议吗?
  • 其实是的,你用过JavaScript吗?

标签: asp.net vb.net controls webforms web-controls


【解决方案1】:

这是一个非 jQuery 示例,说明如何执行此客户端。 如果您需要更多帮助来将此示例付诸实践,请告诉我。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript" src="jquery-1.3.2-vsdoc2.js"></script>


    <script type="text/javascript">

        function selectDeselect(button) {
            var checked = (button.value === 'Select All');
            var checkboxes = document.getElementsByName('myCheckBoxGroup');                     
            for (var i = 0; i <  checkboxes.length; i++) {
                checkboxes[i].checked = checked;
            }

            button.value = (checked) ? 'Deselect All' : 'Select All';           
        }

    </script>

    <style type="text/css">

    </style>
</head>
<body>

    <input type="button" value="Select All" onclick="selectDeselect(this);" />

    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />
    <input type="checkbox" name="myCheckBoxGroup" />

</body>
</html>

【讨论】:

    【解决方案2】:

    Controls collection 不是深度或递归的 - 它只包含 immediate 子控件。如果您无法确定控件最终会在哪里结束,或者如果您确定,您需要递归地执行此操作,或者如果您确定,请确保您的目标是您知道包含所有复选框的特定容器。

    要递归搜索,请尝试以下操作:

    Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
        CheckCheckBoxes(Me)
    End Sub
    
    Protected Sub CheckCheckBoxes(ByVal ctrl as Control)
        For Each childCtrl in ctrl.Controls
            If TypeOf childCtrl Is CheckBox AndAlso childCtrl.Text.StartsWith("ClientCheckBox_") Then
                CType(childCtrl, CheckBox).Checked = True
            Else
                CheckCheckBoxes(childCtrl)
            End If
        Next
    End Sub
    

    【讨论】:

    • 在控件本身上递归执行此操作?
    • @hmcclungii 是的 - 通过在每个控件集合之间移动并向下递归控制树。
    【解决方案3】:

    对于需要控件在对象层次结构之间相互通信的情况,最好使用如下观察者模式(可以根据需要调整为服务器端或客户端代码):

    从一个简单的类开始代表你的通知器:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI.WebControls;
    
    public class CheckAllManager
    {
        public static CheckAllManager Instance
        {
            get
            {
                if (HttpContext.Current.Session["CheckAllManager"] == null)
                {
                    HttpContext.Current.Session["CheckAllManager"] = new CheckAllManager();
                }
                return (CheckAllManager)HttpContext.Current.Session["CheckAllManager"];
            }
        }
    
        private HashSet<CheckBox> checkboxes = new HashSet<CheckBox>();
    
        private CheckAllManager() { }
    
        public void Register(CheckBox checkbox)
        {
            checkboxes.Add(checkbox);
        }
    
        public void Unregister(CheckBox checkbox)
        {
            checkboxes.Remove(checkbox);
        }
    
        public void CheckAll(bool checkState)
        {
            foreach (CheckBox checkbox in checkboxes)
            {
                checkbox.Checked = checkState;
            }
        }
    }
    

    显然,您应该根据自己的需要调整这个类,但它非常简单:

    • 在创建复选框时致电 CheckAllManager.Instance.Register(checkbox)
    • 请致电CheckAllManager.Instance.Unregister(checkbox) 处理复选框。
    • 调用CheckAllManager.Instance.CheckAll(state) 设置注册到该类的所有复选框的状态。

    此技术无需依赖复选框以特定方式命名或递归每个对象的 Controls 集合即可工作。

    【讨论】:

    • 如果您使用的是 .NET 2.0,请将 Dictionary 替换为 HashSet,将 Add 方法替换为 checkboxes.Add(checkbox, null),并使用 foreach 遍历复选框(checkbox 复选框在 checkboxes.Keys 中)。
    【解决方案4】:
    Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
       CheckAll(Me, "ClientCheckBox_")
    End Sub
    
    Sub CheckAll(parent as Control, startsWith as String)
       Dim cb as CheckBox = TryCast(parent, CheckBox)
       If cb IsNot Nothing AndAlso cb.Text.StartsWith(startsWith) Then
          cb.Checked = True
       End If
    
       For Each c as Control in parent
          CheckAll(c, startsWith)
       Next
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多