2009-08-30 5 views
2

Я пытаюсь проверить все флажки на странице webform (aspx), которая находится внутри главной страницы, в зависимости от идентификатора флажка. Флажки создаются динамически, поэтому я знаю только префикс для его поиска. Таким образом, мне нужно найти эти флажки, итерации элементов управления на странице. Это не работает. Любая помощь будет оценена ...Check All Checkboxes

Вот код позади, где должна происходить проверка ...

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

+2

кроме боли, у вас есть предложение? – hmcclungiii

+1

На самом деле да, вы использовали JavaScript? – ChaosPandion

ответ

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

+1

@hmcclungii yes - рекурсия вниз по дереву управления, перемещаясь по каждой коллекции элементов управления. –

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, замените словарь для HashSet, замените флажок Добавить методом на флажки .Add (checkbox, null) и перебрать флажки с помощью флажка foreach (CheckBox в checkboxes.Keys). – Juliet