Проверьте все флажки - PullRequest
       20

Проверьте все флажки

2 голосов
/ 30 августа 2009

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

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

    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

Ответы [ 4 ]

3 голосов
/ 30 августа 2009

Вот не-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 голос
/ 30 августа 2009

В ситуациях, когда вам нужны элементы управления для связи друг с другом между иерархиями объектов, лучше использовать шаблон наблюдателя следующим образом (при необходимости может быть адаптирован как серверный или клиентский код):

Начните с простого класса для представления уведомителя:

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), чтобы установить состояние всех флажков, зарегистрированных в классе.

Этот метод работает, не полагаясь на чекбоксы, которые будут названы определенным образом, или не повторяя каждый объект коллекции.

1 голос
/ 30 августа 2009

Коллекция Controls не является глубокой или рекурсивной - она ​​содержит только дочерние элементы управления немедленное . Вам нужно делать эту операцию рекурсивно, если вы не можете быть уверены в том, где могут находиться элементы управления, или если вы уверены, что вы нацеливаетесь на определенный контейнер, который, как вы знаете, содержит все ваши флажки.

Для рекурсивного поиска попробуйте что-то вроде:

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 голосов
/ 30 августа 2009
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
...