我有一个工作正常的UserControl。它被宣布为这样。
public partial class DynamicList : System.Web.UI.UserControl
{
protected static BaseListController m_GenericListController = null;
public DynamicList()
{
m_GenericListController = new GenericListController(this);
}
}
现在我想覆盖这个控件,这样我就可以改变一些属性。我创建了一个这样的类。
public partial class JobRunningList : DynamicList
{
public JobRunningList()
{
m_GenericListController = new JobListController(this);
(m_GenericListController as GenericListController).ModuleId = 14;
}
}
虽然现在使用JobRunningList控件导致可预测的错误结果,但似乎没有创建DynamicList中的控件。 DynamicList UserControl上有一个ListView和一些其他控件。看来这些在使用JobRunningList时不会创建。这有什么秘密吗?
答案 0 :(得分:0)
无聊的解决方法是将JobRunningList设置为包含DynamicList的普通旧用户控件,并在其OnLoad中设置内部控件的属性。如果DynamicList有许多你想从页面访问的其他属性,那就太尴尬了,因为JobRunningList必须定义自己的匹配属性。回到继承方法,然后......
DynamicList类只包含逻辑背后的代码,因此如果您希望第二个控件重用第一个控件后面的逻辑但提供自己的新UI,那么您正在做的很好。
.ascx文件中的标记被编译到另一个继承DynamicList的类中,因此如果您可以让JobRunningList类继承该类而不是DynamicList,您将获得所需的结果。此类获取从文件名派生的默认名称,但您可以通过在控制指令中设置ClassName而不是自动名称来避免猜测。
采用像
这样的简单基础控制<%@ 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何时可见。只要您的派生控件与父控件位于同一目录中,您可能就可以了,否则很容易遇到构建错误,抱怨该类不存在,因为尚未编译父控件。
答案 1 :(得分:0)
如果我理解正确,您希望界面相同。在这种情况下,我会创建一些属性。也许只是一个简单的枚举,即ListType。