C# 为什么自定义CompositeControl设置的Enabled属性仍然为disabled=";残疾人士;当属性被重写时?

C# 为什么自定义CompositeControl设置的Enabled属性仍然为disabled=";残疾人士;当属性被重写时?,c#,asp.net-3.5,custom-server-controls,C#,Asp.net 3.5,Custom Server Controls,我创建了一个从CompositeControl继承的自定义服务器控件。在CreateChildControls方法中,我将输入和标签控件(还有其他控件)添加到控件树中。我已重写Enabled属性,以便只获取/设置输入的Enabled属性,而不是复合控件的Enabled属性。在使用此服务器控件的用户控件中,我将Enabled=“false”添加到标记中。但是,无论我做什么,container div都会添加一个disabled=“disabled”属性(一些子项也是如此) 当然,除了IE6之外,这

我创建了一个从CompositeControl继承的自定义服务器控件。在CreateChildControls方法中,我将输入和标签控件(还有其他控件)添加到控件树中。我已重写Enabled属性,以便只获取/设置输入的Enabled属性,而不是复合控件的Enabled属性。在使用此服务器控件的用户控件中,我将
Enabled=“false”
添加到标记中。但是,无论我做什么,container div都会添加一个
disabled=“disabled”
属性(一些子项也是如此)

当然,除了IE6之外,这似乎在所有浏览器中都能正常工作。如果禁用的控件中有字段集图例或单选按钮列表,则文本将消失。我最初是想看看是否有一些缺陷需要通过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" />

我通过创建一个“新”启用的属性而不是重写来解决这个问题

public new bool Enabled
{
    get { return _textBox.Enabled; }
    set { _textBox.Enabled = value; }
}

我不会接受这个答案,除非我得到其他人的投票,证明我的发现有必要这样做。

这是有道理的。属性本身在CompositeControl中可能不起任何作用。相反,它将在Render方法中读取(或者类似的,我还没有读取源代码)。通过创建新属性,((CompositeControl)this).Enabled仍将读取为true。这对于CompositeControl的编写方式是唯一的吗?我认为如果我从头开始编写控件并使用Render方法,就不会看到这种行为。我必须深入研究框架代码才能找到答案。