2013-03-15 75 views
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> 

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

+1

如何显示文本?请发布usercontrol的代码。 – ken2k 2013-03-15 13:13:08

+0

你正在得到什么错误? – Pranav 2013-03-15 13:16:30

+0

用户控件因此为空。文字写在设计师页面中。因此,例如用户控件B将具有: – user1203996 2013-03-15 13:16:39

回答

1

对于像你的榜样简单控件添加相同的代码,组合通常是比继承更好的解决方案。考虑其对照B里面含有它控制一个实例:

<%@ 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)); 
+0

这个作品谢谢你。但是,我应该想让事情复杂化,例如在控件A中有一个内容占位符 - 并且控件B,C,D想要使用它 - 使用Inheritance还是包含如上所示的实例是理想选择? – user1203996 2013-03-16 08:36:10

0

您必须添加

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

或封装的control Acontrol B,并在your control BCode Behind, 以加载control A

+0

这个例子不起作用。 – user1203996 2013-03-16 08:50:43

+0

这很奇怪的user1203996,因为当你在容器上使用Add方法时,他插入到容器的顶部 – 2013-03-18 08:33:26