2009-08-30 207 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