C# 为什么自定义CompositeControl设置的Enabled属性仍然为disabled=";残疾人士;当属性被重写时?
我创建了一个从CompositeControl继承的自定义服务器控件。在CreateChildControls方法中,我将输入和标签控件(还有其他控件)添加到控件树中。我已重写Enabled属性,以便只获取/设置输入的Enabled属性,而不是复合控件的Enabled属性。在使用此服务器控件的用户控件中,我将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之外,这
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方法,就不会看到这种行为。我必须深入研究框架代码才能找到答案。