2

チェックボックスのIDに応じて、マスターページ内にあるWebフォーム(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

4 に答える 4

3

これは、このクライアント側を実行する方法の非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>
于 2009-08-30T05:29:00.047 に答える
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)クラスに登録されているすべてのチェックボックスの状態を設定するために呼び出します。

この手法は、チェックボックスに特定の名前を付けたり、各オブジェクトのControlsコレクションを繰り返したりすることなく機能します。

于 2009-08-30T05:35:35.353 に答える
1

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
于 2009-08-30T04:45:50.400 に答える
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
于 2009-08-30T04:54:43.987 に答える