"我建了兩個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>
View Code
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: