扩展UserControl

时间:2013-03-15 13:10:07

标签: c# asp.net

我想通过另一个用户控件扩展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>

任何想法,我可能做错了什么?

2 个答案:

答案 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 BCode Behind your control B中, 添加相同的代码以加载control A

相关问题