我想通过另一个用户控件扩展usercontrol。
假设我有一个用户控件A - 显示文本 - “控制A”
用户控制B:A并显示“控制B”。
当我动态加载用户控件B时,页面上只写入“Control B”。
我使用以下代码动态加载它们:
B myControl = (B)Page.LoadControl("~/UC/B.ascx");
myPage.Controls.Add(myControl);
以下是用户控件B的代码:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="B.ascx.cs" Inherits="A" %>
<div>Control B</div>
任何想法,我可能做错了什么?
答案 0 :(得分:1)
对于像您的示例中的简单控件,组合通常是比继承更好的解决方案。考虑让控件B在其中包含控件A的实例:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="B.ascx.cs" Inherits="B" %>
<%@ Register TagPrefix="My" TagName="ControlA" Src="A.ascx" %>
<My:ControlA runat="server" />
Control B
想想看,我从来没有尝试过使用ascx控件的继承,我甚至不知道你期望它做什么。事件和虚函数在继承的上下文中是有意义的,但是如何合并设计器的内容呢?
如果要在基本控件中定义插入点,似乎有两种自然的方法可以实现。我在Master页面的上下文中只使用了PlaceHolder个成员,但也许您可以在用户控件中使用它们。另一方面,始终可以将对象动态插入Controls集合或作为现有控件的子集。
// class A
public void AddMyControl(Control c)
{
mydiv.Controls.Add(c); // mydiv is defined in the designer
}
// somewhere else - maybe in the page?
theControl.AddMyControl(Page.LoadControl(thePath));
答案 1 :(得分:0)
您必须添加
A other = (A)Page.LoadControl("~/UC/B.ascx");
myPage.Controls.Add(other);
或将control A
封装在control B
和Code Behind
your control B
中,
添加相同的代码以加载control A