Asp.net 如何选中页面上的所有复选框?

Asp.net 如何选中页面上的所有复选框?,asp.net,vb.net,controls,webforms,web-controls,Asp.net,Vb.net,Controls,Webforms,Web Controls,我正在尝试检查网页表单(aspx)页面上的所有复选框,该页面位于母版页内,具体取决于复选框的ID。复选框是动态创建的,所以我只知道查找它的前缀。因此,我需要通过某种方式迭代页面上的控件来找到这些复选框 以下是应在其中进行检查的代码: Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click Dim oCheckbox As S

我正在尝试检查网页表单(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
不是深的或递归的-它只包含直接子控件。如果不能确定控件可能会在哪里结束,或者如果确定,则需要递归执行此操作,确保目标是包含所有复选框的特定容器

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

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

下面是一个非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>

无标题页
功能选择取消选择(按钮){
选中的变量=(button.value==“全选”);
var checkbox=document.getElementsByName('myCheckBoxGroup');
对于(变量i=0;i
对于需要控件在对象层次结构之间相互通信的情况,最好使用以下观察者模式(可以根据需要调整为服务器端或客户端代码):

从表示通知程序的简单类开始:

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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Web;
使用System.Web.UI.WebControl;
公共类CheckAllManager
{
公共静态CheckAllManager实例
{
得到
{
if(HttpContext.Current.Session[“CheckAllManager”]==null)
{
HttpContext.Current.Session[“CheckAllManager”]=new CheckAllManager();
}
return(CheckAllManager)HttpContext.Current.Session[“CheckAllManager”];
}
}
私有HashSet复选框=新HashSet();
私有CheckAllManager(){}
公共作废登记簿(复选框)
{
复选框。添加(复选框);
}
公共作废注销(复选框)
{
复选框。删除(复选框);
}
公共void CheckAll(bool checkState)
{
foreach(复选框中的复选框)
{
checkbox.Checked=checkState;
}
}
}
显然,您应该根据自己的需要调整此类,但它非常简单:

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

这种技术不依赖于复选框以特定的方式命名,也不依赖于递归每个对象控件集合。

递归执行此操作,控件本身?@hmcclungii yes-通过移动到每个控件集合中,沿着控件树递归。看到有人到服务器上执行此操作,我感到很痛苦…:(除了痛苦之外,你还有什么建议吗?实际上是的,你使用过JavaScript吗?如果你使用的是.NET 2.0,用字典代替哈希集,用checkboxes.Add(复选框,null)替换Add方法,并使用foreach(checkboxes.Keys中的checkboxes)遍历复选框。
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;
        }
    }
}