Наследование от базового класса System.Web.UI.UserControl - PullRequest
3 голосов
/ 01 марта 2011

Прежде всего, мне интересно, возможно ли это.Я читал легкие ворчания в интернете по этому поводу, но я не был полностью уверен.

Мой сценарий: у меня есть класс базовых диаграмм, у которого есть некоторые методы, которые должны иметь все диаграммы.

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 ]

2 голосов
/ 01 марта 2011

Хотя обычно получается, что в этой ситуации создается пользовательский элемент управления (как предполагает другой ответ), и это хорошо по многим причинам, есть пара других подходов, которые могут быть полезны в ситуациях, когда сложная разметка делает сервер управление неосуществимо.

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 (где элементы управления создаются в коде), оставляя фактические детали разметки для каждой реализации, но позволяя вам поделиться функциональностью.

1 голос
/ 01 марта 2011

К сожалению, часть разметки BaseChart на самом деле не является частью класса BaseChart. Разметка является частью класса, который создается при компиляции и наследуется от BaseChart. Так что HistoricalLineChart содержит только то, что вы явно указали в BaseChart, и ничего из разметки. Единственный способ обойти это - использовать Composite Control или Custom Server Control (против UserControl). Это немного сложнее, так как вы должны добавить свои дочерние элементы управления программно, но должны делать то, что вы хотите.

Вот пример: http://msdn.microsoft.com/en-us/library/3257x3ea(v=VS.100).aspx

В основном:

  1. Наследовать от CompositeControl.
  2. Переопределить CreateChildControls. В этом методе вы можете добавить все свои дочерние элементы управления (например, диаграмму).
  3. Дополнительно: переопределить Render. Переопределите это, если вам нужна пользовательская разметка в дополнение к дочерним элементам управления. Вы можете вывести свою пользовательскую разметку плюс вызов RenderControl на всех ваших дочерних элементах управления, чтобы сообщить им, где следует выводить их выходные данные. Если вы не переопределите этот метод вообще, то составной элемент управления отобразит дочерние элементы управления в том порядке, в котором они находятся в коллекции элементов управления.

Вот еще пара уроков:

0 голосов
/ 01 марта 2011

Вы можете создать protected свойство в BaseChart, которое отображает диаграмму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...