Скучным обходным решением было бы сделать JobRunningList простым старым пользовательским элементом управления, который содержит DynamicList и просто устанавливает свойства внутреннего элемента управления в его OnLoad. Это неудобно, если у DynamicList есть много других свойств, к которым вы хотите получить доступ со страницы, поскольку JobRunningList должен был бы определять собственные соответствующие свойства. Возвращаясь к наследственному подходу, затем ...
Класс DynamicList просто содержит код, лежащий в основе логики, поэтому то, что вы делаете, работает хорошо, если вы хотите, чтобы второй элемент управления повторно использовал логику, стоящую за первым, но предоставлял новый собственный интерфейс.
Разметка в вашем файле .ascx компилируется в другой класс, который наследует DynamicList, поэтому, если вы можете заставить свой класс JobRunningList наследовать этот класс вместо DynamicList, вы получите желаемый результат. Этот класс получает имя по умолчанию, полученное из имени файла, но вы можете не догадываться об этом, установив ClassName в директиве control для использования вместо автоматического имени.
Возьмите простой базовый элемент управления, как
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="HelloControl.ascx.cs" Inherits="HelloControlBase"
ClassName="MyControls.HelloControl" %>
Hello <%= Name %>
с неинтересным кодом вроде
public partial class HelloControlBase : System.Web.UI.UserControl
{
public string Name
{
get;
set;
}
}
Теперь мы хотим переопределить свойство Name в новом элементе управления. Сначала нам нужен HelloAlice.ascx
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="HelloAliceControl.ascx.cs"
Inherits="HelloAliceControl" %>
Не так много, чтобы увидеть здесь, так как мы оставляем всю работу на оригинальный ascx. Теперь в коде позади,
public partial class HelloAliceControl : MyControls.HelloControl
{
protected void Page_Load(object sender, EventArgs e)
{
this.Name = "Alice";
}
}
Мы просто наследуем MyControls.HelloControl и устанавливаем свойство Name, и похоже, что мы закончили.
Проблема в том, что MyControls.HelloControl виден. Пока ваш производный элемент управления находится в том же каталоге, что и родительский элемент управления, вы, вероятно, будете в порядке, в противном случае довольно легко столкнуться с ошибками сборки, жалующимися на то, что класс не существует, поскольку родительский элемент управления еще не скомпилирован.