2009-05-27 8 views
0

ASP.NETでカスタムコンテナコントロールを作成したい場合は、チェックボックスをヘッダーにしてチェックを外して、すべてのコントロールを無効にします。ASP.NETでチェックボックスを含むカスタムパネルを作成するにはどうすればいいですか?

どうすればいいですか?

EDIT:

私の要件に展開するにはロブは、チェックボックスとコンテンツパネルを含む、すなわち、ユーザーコントロールを示唆したように、私が何かを必要とします。しかし、コントロールを再利用する必要がある点でPanelと機能的に似ている必要があります。コントロールの各インスタンスごとに異なる内容を定義する必要があります。説明するのは難しいですが、明らかに「フィーチャー・クリープ」のために申し訳ありません。

答えて

2

正しく認識された場合、チェックボックスをオフにしているときに[enabledプロパティを使用して]パネルを無効にすると、パネル内の項目が無効になります。パネル内のすべての項目を個別に無効にする必要はありません。同様に、パネルを再び有効にすると、子コントロールが再び有効になります。

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; 
} 

これは、パネルのそれと一致するように、パネル内の各コントロールのEnabledプロパティを設定します - 本当に、これはに黒字でありますしたがって、それは本当に望ましいことではありません。私はデモの目的でこの方法を提供しました。

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

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

これでしょう、本質的にコントロールのパネルコントロールをユーザーコントロール外から変更できます。ユーザーコントロール内のパネル定義にコントロールを割り当てる必要はありません。

2

私は次のようにユーザーコントロールを作成します。

<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> 

コードビハインドで

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パネルを無効にすると効果的にすべてを無効にすることが正しいです(VBサンプル)を、これを追加内部。これは、再使用可能なコンテナにカプセル化されます。

このコードは、Ajax.Netライブラリで.Net 3.5または.Net 2を使用しており、コンテンツページまたはマスターページのどこかでScriptManagerを宣言していることを前提としています。 は、Ajaxを正しく使用してですか?

+0

あなたのソリューションがうまく動作するために*必要な* Ajaxはありませんが、それはちょっと使いやすくなります。 – BenAlabaster

+0

私はいつも自分のユーザーに親切であると非難されています。 –

+0

+1これを実装する方法の良い例については、 – BenAlabaster

1

私はこの問題を別の方法で考えていますが、その中のPanel/Checkboxを持つUserControlは、他のコントロールを簡単に追加することができないため、 。

代わりに、CheckboxコントロールのAjax Extenderを引数として、Panelを作成します。次に、Checkboxがクリックされるたびに、​​子コントロールのそれぞれにこのようなコードでアクセスします。

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; 
    } 
} 
関連する問題