0

ASP.NET で (パネルに似た) カスタム コンテナー コントロールを作成したいと考えています。チェック ボックスをヘッダーとして使用し、チェック ボックスをオフにすると、含まれているすべてのコントロールを無効にします。

どうすればこれを行うことができますか?

編集:

私の要件を拡張するには、Rob が提案したようなものが必要です。つまり、CheckBox とコンテンツ パネルを含む UserControl が必要です。ただし、コントロールを再利用して、インスタンスごとに異なるコンテンツを定義できるようにする必要があるという点で、パネルと機能的に似ている必要があります。説明するのが難しいです。明らかに「機能クリープ」で申し訳ありません。

4

3 に答える 3

2

私の記憶が正しければ、チェックボックスがオフのときに [有効なプロパティを使用して] パネルを無効にすると、パネル内の項目が無効になります。その後、パネル内のすべてのアイテムを個別に無効にする必要はありません。同様に、パネルを再度有効にすると、子コントロールが再度有効になります。

myPanel.Enabled = false; //Child controls disabled
myPanel.Enabled = true; //Child controls enabled

以下を使用して、パネル内の各コントロールを繰り返すこともできます。

foreach(Control control in myPanel)
{
    //Assume for the purpose of demonstration 
    //that each control within myPanel has an
    //"Enabled" property
    control.Enabled = myPanel.Enabled;
}

これにより、パネル内の各コントロールの有効なプロパティがパネルのプロパティと一致するように設定されます。実際には、これは要件を超えているため、実際には望ましくありません。このメソッドは、デモンストレーション目的で提供しただけです。

編集:これは、パネルのコントロールコレクションを公開するためにユーザーコントロールにプロパティを追加できるユーザーコントロールのRobの設計によって[たとえば]拡張できます。

public Control[] Controls
{
    return controlPanel.Controls;
}

これにより、ユーザー コントロールの外部からコントロールのパネル コントロールを変更できるようになり、ユーザー コントロール内のパネル定義でコントロールを割り当てる必要がなくなります。

于 2009-05-27T16:21:05.190 に答える
2

次のように UserControl を作成します。

<asp:UpdatePanel ID="upDisableAllPanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:CheckBox AutoPostBack="true" ID="cbTogglePanel" runat="server" />
        <asp:Panel ID="pnlDisableAll" runat="server">
       ... controls here ...
        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>

コード ビハインドにこれを追加します (VB サンプル)

Public MyControls As New ControlCollection(Me)

Protected Sub control_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    bindControls()
End Sub

Protected Sub cbTogglePanel_CheckChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbTogglePanel.CheckChanged
    pnlDisableAll.Enabled = cbTogglePanel.Checked 'Or Not cbTogglePanel.Checked depending on how you have the cb labeled.'
End Sub

Public Sub bindControls()
    If MyControls IsNot Nothing And MyControls.Count > 0 Then
        pnlDisableAll.Controls.Clear()
        For Each cntrl As Control In MyControls
            pnlDisableAll.Controls.Add(cntrl)
        Next
    End If
End Sub

パネルを無効にすると、内部のすべてが効果的に無効になるという@balabasterは正しいです。これにより、再利用可能なコンテナにカプセル化されます。

このコードは、Ajax.Net ライブラリで .Net 3.5 または .Net 2 を使用していて、コンテンツ ページまたはマスター ページのどこかに ScriptManager が宣言されていることを前提としています。あなたAjaxを使っていますよね?

于 2009-05-27T16:34:40.233 に答える
1

この問題については別の方法で対処すると思います。Panel/チェックボックスを内部に持つUserControlは、他のコントロールを簡単に追加できないため、希望どおりに機能するとは思いません。

代わりに、CheckboxコントロールサプライaPanelの引数としてAjaxエクステンダーを作成します。次に、Checkboxがクリックされるたびに、次のPanelsようなコードを使用して各子コントロールにアクセスします。

foreach(Control c in pnlFoo.Controls)
{
   if (!(c is Checkbox)) // probably need a better check than this
   {                   // incase you have other checkboxes inside your panel
      c.Enabled = chkToggler.Checked;
   }
}
于 2009-05-27T17:08:27.043 に答える