如何修改所有ASP.NET控件以从我的特殊控件继承?

时间:2011-10-07 20:34:52

标签: c# asp.net controls

TextBox,Label,Panel,...都继承自Control

有没有办法从Control继承并使ASP.NET控件继承自我的新控件?

例如,我有一个控件

public class SpecialControl : Control
{
    public string Something { get; set; }
}

现在我希望所有控件都从它继承,所以

<asp:TextBox ID="tb" runat="server" Something="hello" />

有效。

3 个答案:

答案 0 :(得分:5)

您无法更改属于BCL的控件的继承链。

答案 1 :(得分:2)

您可以做的一件事是创建一个扩展方法,如下所示。

<asp:TextBox id="tst" runat="server" Something="TestValue"></asp:TextBox> 

 public static string GetSomething(this WebControl value)
{
   return value.Attributes["Something"].ToString();
}

我只对TextBox控件进行了测试。可能不是理想的解决方案,因为它不是强类型的,但会起作用。

答案 2 :(得分:0)

正如Oded所提到的,你无法修改打包控件的继承链。

您可以做的是为打包的控件创建包装器,并在包装​​器中实现自定义属性和方法。这是一个如何扩展TextBox的简单示例:

[DefaultProperty("Text")]
[ToolboxData("<{0}:CustomTextBox runat=server></{0}:CustomTextBox>")]
public class CustomTextBox: System.Web.UI.WebControls.TextBox
{
    [Bindable(true)]
    [DefaultValue("")]
    public string Something
    {
        get
        {
            string something = (string)ViewState["Something"];
            return (something == null) ? String.Empty : something ;
        }
        set
        {
            ViewState["Something"] = value;
        }
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(Text);
    }
}