2011-10-21 23 views
1

私のスペックはアクティブになっている制御するためのラジオボタングループ側に沿って下方OR 2つのカレンダーボックス降下を呼び出すので、私は、このユーザーコントロールを作っ:コントロールのグループを有効/無効にする方法は?

<asp:RadioButton 
    GroupName="group1" 
    ID="DateMacroRadioButton" 
    runat="server" 
    Checked="true" /> 
<uc:DateMacroSelector ID="DateMacroSelector1" runat="server" /> 
<asp:RadioButton GroupName="group1" 
    ID="CustomDateRadioButton" 
    runat="server" 
    AutoPostBack="true" Text="" /> 
<uc:DateSelector ID="DateSelector1" runat="server" /> 
to 
<uc:DateSelector ID="DateSelector1" runat="server" /> 

enter image description here

のI /有効たいですグループを使用して子コントロールを無効にします。

<asp:RadioButton 
    GroupName="group1" 
    ID="DateMacroRadioButton" 
    runat="server" 
    Checked="true" /> 
<uc:EnableGroup ID="EnableGroup1" runat="server" 
    CheckBoxId="DateMacroRadioButton"> 
    <uc:DateMacroSelector ID="DateMacroSelector1" runat="server" /> 
</uc:EnableGroup> 
<asp:RadioButton GroupName="group1" 
    ID="CustomDateRadioButton" 
    runat="server" 
    AutoPostBack="true" Text="" /> 
<uc:EnableGroup ID="EnableGroup12 runat="server" 
    CheckBoxId="CustomDateRadioButton"> 
    <uc:DateSelector ID="DateSelector1" runat="server" /> 
    to 
    <uc:DateSelector ID="DateSelector1" runat="server" /> 
</uc:EnableGroup> 

このように動作するユーザーコントロールを設計するにはどうすればよいですか?

答えて

1

あなたはカスタムコントロールを作成することができ、このような何かが機能するはず(それはデザイナーで動作させるために「parsechildren」の設定を取得することは、常に面倒ですが、私は、これは正しいと思う):

[ParseChildren(typeof(WebControl), ChildrenAsProperties = true, 
    DefaultProperty = "ChildControls"), NonVisualControl] 
public class EnableGroup: Control 
{ 
     public EnableGroup() { 
      ChildControls = new Collection<WebControl>(); 
     } 

     protected override void OnPreRender(EventArgs e) 
     { 
      foreach (WebControl ctl in Controls) { 
       ctl.Enabled = this.Enabled; 
      } 
      base.OnPreRender(e); 
     } 

     public Collection<WebControl> ChildControls 
     { 
      get; 
      protected set; 
     } 
} 

しかし、正直言って、単に拡張メソッドなどを書くのと同じくらい簡単かもしれません。

public static SetChildEnabled(this WebControl parent) { 
    foreach (WebControl ctl in parent.Controls) { 
     ctl.Enabled = parent.Enabled; 
    } 
} 

それからちょうど...

<asp:PlaceHolder runat="server" id="Group1"> 
</asp:PlaceHolder> 

をあなたのグループをラップし、事前レンダリングにそのコードを呼び出すために、古いコントロールを使用します。

Group1.SetChildEnabled() 

あなたはどちらかにするにはかなり簡単に再帰的に仕事ができます必要に応じてより深くネストされた子を処理します。

考えてみると、PlaceHolderを拡張し、上記の難しい部分をスキップするコントロールを作成することができます。あなたのコンテナに許可されているオブジェクトタイプを制御できるようにしたい場合、それはあなたのやり方ですそれは過剰です。

+0

これはいい答えです。ありがとうございます。私は今、Controlsコレクションを反復し、Enabledという名前のboolプロパティを再帰的に反映できると考えています。 –

+0

あなたのコードが子供のシナリオをどのようにサポートできるか知っていますか? UserControlsコントロール(最初のやり方を話して、自分のサーバーコントロールを作成することについて話をする) - すべてのアイテムタイプがWebControlでなければならないというエラーが表示されます...ちょっと好奇心 - プレースホルダーの方法から派生したものを試してみます... –

+0

OK i gotそれはWebコントロールをテンプレートコントロールに変更し、そのタイプが有効か無効かを調べるために "is"を使用します。私はこれに答えてマークします。 –

関連する問題