3

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

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

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”

问题是 Chart1 在 HistoricalLineChart 的范围内是未定义的。我在这里缺少什么吗?

谢谢。

4

3 回答 3

2

尽管通常在这种情况下最终只是制作自定义控件(正如另一个答案所暗示的那样),这有很多原因,但在复杂标记使服务器控件不可行的情况下,还有一些其他方法可能很有用。

1) 创建一个基类,它具有您的实现共有的所有功能并继承 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(在代码中创建控件)的构造,将标记的实际细节留给每个实现,但是让您共享功能。

于 2011-02-28T22:59:53.920 回答
1

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

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

基本上:

  1. 继承自CompositeControl
  2. 覆盖CreateChildControls。在此方法中,您可以添加所有子控件(如图表)。
  3. 可选:覆盖Render。如果除了子控件之外还需要自定义标记,请覆盖此选项。您可以输出您的自定义标记并调用RenderControl您的所有子控件来告诉他们在哪里呈现他们的输出。如果您根本不重写此方法,那么复合控件将按照子控件在控件集合中的顺序呈现出子控件。

这里还有几个教程:

于 2011-02-28T21:52:58.473 回答
0

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

于 2011-02-28T21:52:09.740 回答