Наследование от базового класса System.Web.UI.UserControl
Прежде всего, мне интересно, если это возможно. Я читал легкие ворчания в интернете по этому поводу, но я не был полностью уверен.
Мой сценарий: у меня есть класс базовых диаграмм, в котором есть несколько методов, которые должны иметь все диаграммы.
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"
Проблема в том, что Chart1 не определен в области действия HistoricalLineChart. Есть ли что-то, что мне здесь не хватает?
Благодарю.
3 ответа
К сожалению, часть разметки BaseChart
на самом деле не является частью BaseChart
учебный класс. Разметка является частью класса, который создается при компиляции и наследуется от BaseChart
, Так HistoricalLineChart
содержит только то, что вы явно указали в BaseChart
и нет разметки. Единственный способ обойти это - использовать Composite Control или Custom Server Control (против UserControl). Это немного сложнее, так как вы должны добавить свои дочерние элементы управления программно, но должны делать то, что хотите.
Вот пример: http://msdn.microsoft.com/en-us/library/3257x3ea(v=VS.100).aspx
В принципе:
- Наследовать от
CompositeControl
, - Override
CreateChildControls
, В этом методе вы можете добавить все свои дочерние элементы управления (например, диаграмму). - Необязательно: переопределить
Render
, Переопределите это, если вам нужна пользовательская разметка в дополнение к дочерним элементам управления. Вы можете вывести свою пользовательскую разметку плюс вызовRenderControl
на все ваши дочерние элементы управления, чтобы сказать им, где визуализировать их вывод. Если вы не переопределите этот метод вообще, то составной элемент управления отобразит дочерние элементы управления в том порядке, в котором они находятся в коллекции элементов управления.
Вот еще пара уроков:
Несмотря на то, что в этой ситуации обычно нужно просто создать пользовательский элемент управления (как предполагает другой ответ), и это хорошо по многим причинам, есть пара других подходов, которые могут быть полезны в ситуациях, когда сложная разметка делает невозможным управление сервером.
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) Создайте реализации UserControl, которые наследуют MyUserControl вместо UserControl, и добавьте разметку
public partial class HistoricalLineChart : MyUserControl
{
public HistoricalLineChart(int reportID)
: base()
{
Chart1.Titles[0].Text = "Hello World";
}
}
Вы также можете создать интерфейс, который описывает любые элементы управления, которые должны появляться в разметке, и реализовывать это. Это хорошо, потому что дает вам конструкцию, которая применима либо к UserControl (где элементы управления определены в разметке), либо к WebControl (где элементы управления создаются в коде), оставляя фактические детали разметки для каждой реализации, но позволяя вам поделиться функциональностью.
Вы можете сделать protected
недвижимость в BaseChart
это разоблачает график.