私はCompositeControlから継承するカスタムサーバーコントロールを作成しました。 CreateChildControlsメソッドでは、コントロールツリーに入力とラベルコントロール(他にもある)が追加されています。 Enabledプロパティをオーバーライドして、コンポジットコントロールのEnabledプロパティではなく、入力のEnabledプロパティのみを取得または設定するようにしました。このサーバーコントロールを使用するユーザーコントロールでは、Enabled="false"
をマークアップに追加します。しかし、私が何をしても、コンテナdivにはdisabled="disabled"
という属性が追加されます(子供の一部も同様です)。プロパティがオーバーライドされても、カスタムCompositeControlのEnabledプロパティがdisabled = disabledに設定されているのはなぜですか?
もちろん、これはIE 6を除くすべてのブラウザで正常に機能しているようです。フィールドセットの凡例または無効なコントロール内のラジオボタンリストがある場合、テキストは消えます。私はもともと、IE 6用にCSS経由で修正する欠陥があるかどうかを確認しようとしていました。そして、私はその属性を持っているとは思わなかったタグについてdisabled="disabled"
に気付きました。
私は正確にここで間違っていますか?挙動を示す
サンプルコントロール:
public class TextBoxWithLabel : CompositeControl
{
private readonly Label _label = new Label();
private readonly TextBox _textBox = new TextBox();
protected override HtmlTextWriterTag TagKey
{
get { return HtmlTextWriterTag.Div; }
}
public string LabelText
{
get { return _label.Text; }
set { _label.Text = value; }
}
public override bool Enabled
{
get { return _textBox.Enabled; }
set { _textBox.Enabled = value; }
}
protected override void CreateChildControls()
{
_label.ID = ID + "_label";
_textBox.ID = ID + "_field";
_label.AssociatedControlID = _label.ID;
Controls.Add(_label);
Controls.Add(_textBox);
}
}
は使用方法:
<test:TextBoxWithLabel id="tester" runat="server" LabelText="My TextBox" Enabled="false" />
これは意味があります。プロパティ自体はおそらくCompositeControlでは何もしません。代わりに、Renderメソッド(またはそのようなもの、私はソースを読んでいない)で読み取られます。新しいプロパティを作成することによって((CompositeControl)this).Enabledは引き続きtrueと読み取られます。 –
これはCompositeControlの書き方に固有のものですか?私はコントロールをゼロから作成し、レンダリングメソッドを使用した場合、この動作が見られないと考えています。私は、フレームワークコードを見つけ出す必要があります。 – Sumo