首先,我想知道这是否可能。我在互联网上读到有关此事的抱怨声,但我不确定。

我的场景:我有一个基本的图表类,其中包含一些所有图表都应具有的方法。

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是没有标记的网络用户控件,例如“ HistoricalLineChart.ascx”

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

谢谢。

最佳答案

不幸的是,BaseChart的标记部分实际上不是BaseChart类的一部分。标记是在编译时创建的类的一部分,它是从BaseChart继承的。因此,HistoricalLineChart仅包含您在BaseChart中明确设置的内容,而不包含任何标记。我知道解决此问题的唯一方法是使用复合控件或自定义服务器控件(相对于UserControl)。由于您必须以编程方式添加子控件,但应该按照自己的意愿进行操作,这会比较麻烦。

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

基本上:


CompositeControl继承。
覆盖CreateChildControls。使用这种方法,您可以添加所有子控件(如图表)。
可选:覆盖Render。如果除了子控件之外还需要自定义标记,请重写此方法。您可以在所有子控件上输出自定义标记以及调用RenderControl,以告诉他们在何处呈现其输出。如果根本不重写此方法,则复合控件将按照子控件在控件集合中的顺序来呈现子控件。


这里还有更多教程:


http://www.codeproject.com/KB/custom-controls/customdialog.aspx
http://msdn.microsoft.com/en-us/library/aa479016.aspx
http://www.codersource.net/asp-net/asp-net-advanced/creating-a-composite-control-in-asp-net.aspx

10-05 23:01