检查所有复选框
我想检查web窗体(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
的Controls collection不深或递归 - 它仅包含直接子控件。如果您无法确定控件的最终位置,或者您确定要确定您的目标是您知道包含所有复选框的特定容器,则需要递归执行此操作。
递归搜索,你可以试试:
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
这个操作是递归地做什么的,控制自己? – hmcclungiii 2009-08-30 04:48:04
@hmcclungii是 - 通过移动到每个控件集合来缓存控制树 – 2009-08-30 04:51:05
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
这里是如何做到这一点客户端非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>
对于其中需要控制,以对象的层次之间彼此通信的情况下,你最好如下使用观察者模式(根据需要可以适于作为服务器端或客户端代码) :
开始用一个简单的类来表示您的通知:
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)
设置所有注册到该类的复选框的状态。
此技术不依赖于复选框被命名为特定方式或递归每个对象控件集合。
如果您使用的是.NET 2.0,请将Dictionary
让我痛苦的是,看到人们去服务器做这个...... :( – ChaosPandion 2009-08-30 05:07:15
除了痛苦之外,你有什么建议吗? – hmcclungiii 2009-08-30 05:11:51
其实是的,你用过JavaScript吗? – ChaosPandion 2009-08-30 05:16:45