继承自System.Web.UI.UserControl基类

时间:2011-02-28 21:48:18

标签: c# asp.net inheritance user-controls composite-controls

首先,我想知道这是否可行。我在互联网上看到了关于此的轻微抱怨,但我并不完全确定。

我的场景:我有一个基础图表类,它有一些所有图表都应该有的方法。

public partial class BaseChart : System.Web.UI.UserControl
{
    public BaseChart()
    {
    }

    public void ToggleLegend()
    {
        Chart1.Legends[0].Enabled = !Chart1.Legends[0].Enabled;
    }
}

此BaseChart还有一些标记 - 设置背景颜色等。所有继承BaseChart的图表都应使用此开始标记并能够在其上构建。

我想这样做:

public partial class HistoricalLineChart : BaseChart
{
    public HistoricalLineChart()
        : base()
    {
    }

    public HistoricalLineChart(int reportID)
        : base()
    {
        Chart1.Titles[0].Text = "Hello World";
    }
 }

其中HistoricalLineChart是一个没有标记的Web用户控件,例如“HistoricalLineChart.ascx”

问题是,在HistoricalLineChart的范围内,Chart1未定义。我在这里找不到什么东西吗?

感谢。

3 个答案:

答案 0 :(得分:2)

虽然通常最终只是在这种情况下进行自定义控制(正如另一个答案所示),这有很多原因,但是在复杂标记构成服务器的情况下,还有其他一些方法可能会有用。控制不可行。

1)创建一个基类,它具有您的实现共有的所有功能,并继承UserControl。如果你真的想要将标记作为基类的一部分包含在内,你可以将它放在一个没有代码的单独的usercontrol中,并从抽象类中加载它,尽管这看起来有点难看。但是,如果共享的标记很简单,只需从代码中渲染它。

public abstract class MyUserControl: UserControl
{
     public Chart Chart1;
     public void ToggleLegend()
    {
        Chart1.Legends[0].Enabled = !Chart1.Legends[0].Enabled;
    }
    public override void CreateChildControls()
    {
        Controls.Add(Page.LoadControl("path/to/mymarkup/control"));
        // or add them in code
        BuildBaseControls();
    }
}

2)创建继承MyUserControl而不是UserControl的UserControl实现,并添加标记

public partial class HistoricalLineChart : MyUserControl
{
    public HistoricalLineChart(int reportID)
        : base()
    {
        Chart1.Titles[0].Text = "Hello World";
    }
}

您还可以创建一个界面来描述应该出现在标记中并实现该控件的任何控件。这很好,因为它为您提供了一个适用于UserControl(其中控件在标记中定义)或WebControl(其中控件是在代码中创建)的构造,将标记的实际细节留给每个实现,但是让你分享功能。

答案 1 :(得分:1)

不幸的是BaseChart的标记部分实际上并不是BaseChart类的一部分。标记是在编译时创建的类的一部分,它继承自BaseChart。因此HistoricalLineChart仅包含您在BaseChart中明确设置的内容,而不包含任何标记。我知道解决这个问题的唯一方法是使用复合控件或自定义服务器控件(与UserControl相比)。由于你必须以编程方式添加子控件,但是应该做你想要的事情,这有点痛苦。 / p>

以下是一个示例:http://msdn.microsoft.com/en-us/library/3257x3ea(v=VS.100).aspx

基本上:

  1. 继承自CompositeControl
  2. 覆盖CreateChildControls。在此方法中,您可以添加所有子控件(如图表)。
  3. 可选:覆盖Render。如果除了子控件之外还需要自定义标记,请重写此项。您可以在所有子控件上输出自定义标记和调用RenderControl,以告知它们在何处呈现其输出。如果您根本不重写此方法,则复合控件将按照它们在控件集合中的顺序呈现出子控件。
  4. 以下是一些教程:

答案 2 :(得分:0)

您可以在protected中创建一个公开图表的BaseChart属性。