2013-03-15 76 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