2009-08-30 160 views
2

我想检查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 
+0

让我痛苦的是,看到人们去服务器做这个...... :( – ChaosPandion 2009-08-30 05:07:15

+2

除了痛苦之外,你有什么建议吗? – hmcclungiii 2009-08-30 05:11:51

+1

其实是的,你用过JavaScript吗? – ChaosPandion 2009-08-30 05:16:45

回答

1

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 
+0

这个操作是递归地做什么的,控制自己? – hmcclungiii 2009-08-30 04:48:04

+1

@hmcclungii是 - 通过移动到每个控件集合来缓存控制树 – 2009-08-30 04:51:05

0
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 
2

这里是如何做到这一点客户端非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> 
1

对于其中需要控制,以对象的层次之间彼此通信的情况下,你最好如下使用观察者模式(根据需要可以适于作为服务器端或客户端代码) :

开始用一个简单的类来表示您的通知:

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)设置所有注册到该类的复选框的状态。

此技术不依赖于复选框被命名为特定方式或递归每个对象控件集合。

+0

如果您使用的是.NET 2.0,请将Dictionary 替换为HashSet,将复选框替换为Add方法.Add(复选框,null),并使用foreach(Checkboxes.Keys中的CheckBox复选框)遍历复选框。 – Juliet 2009-08-30 05:43:33