首先,我想知道这是否可能。我在互联网上读到有关此事的抱怨声,但我不确定。
我的场景:我有一个基本的图表类,其中包含一些所有图表都应具有的方法。
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