"我建了兩個ascx,ascxA,ascxB
ascxA中放了一個PlaceHold,
ascxB中放了一個textBox
ascxA在page_load中動態創建了5個ascxB但是頁面上什么都沒顯示"
這是來自論壇網友的問題,Insus.NET就以此問題做一個演示例子,方法與技巧分享給大家。
在站點上創建一個用戶控件ascx B, 拉一個TextBox在這個控件上。
創建另一個用戶控件ascx A 在這個用戶控件上,拉一個Textbox 和一個按鈕,是讓用戶在文本框輸入數據,點一點銨鈕,這樣動態產生ascx B用戶控件,呈現於ascx A用戶控件的頁面上。
在站點上,創建一個aspx網頁。把用戶控件ascx 引用至aspx網頁上。再在aspx網頁上拉一個按鈕。讓用戶點一點這個銨鈕,去獲取動態產生的文本框的值,並顯示於aspx網頁上。
現在的問題,ascx A動態加載ascx B. 根據用戶輸入的數字來產生。
怎樣在aspx網頁上,去獲取那些動態產生文本框的值?
好,帶着疑問一步一步來完成它們。
創建一個站點,Insus.NET使用的是.NET 4.0 和C#作為程序語言。
創建一個AscxB.ascx用戶控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AscxB.ascx.cs" Inherits="AscxB" %> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
AscxB.ascx.cs:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class AscxB : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } }
在站點上創建用戶控件AscxA.asx,在此控件上,拉一個文本框TextBox,一個銨鈕Button和一個容器PlaceHolder。在銨鈕添加onclick事件OnClick="ButtonGenerate_Click"

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AscxA.ascx.cs" Inherits="AscxA" %> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="ButtonGenerate" runat="server" Text="Generate" OnClick="ButtonGenerate_Click" /><br /> <br /> <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
AscxA.ascx.cs:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class AscxA : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } protected void ButtonGenerate_Click(object sender, EventArgs e) { } }
下面是動態加載用戶控件的方法,為了能讓用戶控件ascx a加載到ascx b。 Insus.NET在此,先創建接口(interface):
接口寫好,去ascx B實作這個接口:
我們回到用戶控件ascxA cs代碼頁,去寫按鈕Click的事件:
上圖中的29行代碼,是判斷文件框是否為空,是不是為數字。
第35代碼,是動態加載用戶控件ascx B之后,並轉為接口IUserControlable。然后加入PlaceHolder容器中去。
現在,我們創建一個網頁.aspx,在此網頁中,我們引用用戶控件ascxa,還在拉一個銨鈕,和個Literal控件,銨鈕與Literal最開始狀態是隱藏的,主要是用來獲取數據與顯示數據。
.aspx.cs代碼:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; public partial class DynamicallyLoadUserControlDemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void ButtonGetValue_Click(object sender, EventArgs e) { } }
現在,我們做一些其它,即是說,在Ascx A用戶控件,當有動態產生Ascx B控件之后,在網頁的Button才會顯示。如果沒有產生過銨鈕,網頁Button就是隱藏起來。
由於是否有控件產生是發生在ascx A用戶控件,而隱藏的對象在網頁上。這涉及到用戶控件與網頁之間的溝通與協調。
為了減低程序的復雜度,Insus.NET得寫一個接口,這個接口主體只有一個只寫屬性。
接口寫好了,我們在網頁.aspx.cs實作這個接口。說明白一點,就是網頁的銨鈕只接受顯示與隱藏,是誰來決定顯示與隱藏,它管不了。
具體是誰來控制顯示與隱藏呢,剛才所說,是在用戶控件ascx A的動態產生ascx B之后,這個網頁的Button就顯示。因此,我們去用戶控件ascx a的產生控件代碼中添加:
有點疑問,怎樣能把網頁轉為接口呢? 因為我們上面有把網頁實作了IShowable這個接口。
Ok, 我們回到網頁cs,准備寫銨鈕click事件,來獲取數據。不過獲取數據起來,是有點困難,因為動態產生的控件,全是在用戶控件ascx A中呈現,而且每呈現的文本框是來自ascx B。
在網頁中,怎樣獲取俄用戶控件的ascx A的容器PlaceHolder呢? Insus.NET只會使用接口,因此還是寫另外一個接口,是為了讓網頁.aspx.cs去讀取用戶控件的Ascx A的PlaceHolder。
我們去用戶控件ascx A實用這個接口:
這樣子,我們就可以在網頁.aspx.cs的獲取值的銨鈕獲取這個容器了。另外,由於容器根據用戶的需求,也許不止單一次產生一個ascx B用戶控件,也許會有好幾個。我們怎樣知道哪一個文本框TextBox是哪一個TextBox呢?
還是寫一個接口吧,
接口寫好,我們去ascx B用戶控件來實作這個接口:
到現在為止,我們完全可以去網頁代碼中,去寫銨鈕的Click獲取值的事件了:
上面代碼中,#0是獲取placeholder容器。
#1是foreach容器中所有文本框。
#2是顯示文本框的值。
到此為止,算是演示完成了。不過,我們還是來一個最終的效果演示吧:
Demo source code:
http://download.cnblogs.com/insus/ASPDOTNET/Ascx_load_ascx_page_getvalue.rar