1

我想通过另一个用户控件扩展用户控件。

假设我有一个用户控件 A - 显示文本 - “控件 A”

用户控件 B:A 并显示“控件 B”。

当我动态加载用户控件 B 时,页面上只写了“控件 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>

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

4

2 回答 2

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 控件一起使用,我什至不知道你会期望它做什么。事件和虚函数在继承的上下文中是有意义的,但是设计者的内容应该如何合并呢?

如果您想在基本控件中定义插入点,似乎有两种自然的方法可以做到这一点。我只在母版页的上下文中使用了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));
于 2013-03-15T23:04:32.183 回答
0

您必须添加

A other = (A)Page.LoadControl("~/UC/B.ascx");
myPage.Controls.Add(other);

或者封装你的control Aincontrol B和 in Code Behindyour control B添加相同的代码以便加载control A

于 2013-03-15T13:20:23.373 回答