天天看點

在使用者控件(ASCX)建立使用者控件(ASCX)

"我建了兩個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使用者控件:

在使用者控件(ASCX)建立使用者控件(ASCX)
在使用者控件(ASCX)建立使用者控件(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:

在使用者控件(ASCX)建立使用者控件(ASCX)
在使用者控件(ASCX)建立使用者控件(ASCX)
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"

在使用者控件(ASCX)建立使用者控件(ASCX)
在使用者控件(ASCX)建立使用者控件(ASCX)
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AscxA.ascx.cs" Inherits="AscxA" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>&nbsp;&nbsp;<asp:Button ID="ButtonGenerate" runat="server" Text="Generate" OnClick="ButtonGenerate_Click" /><br />
<br />
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>      

AscxA.ascx.cs:

在使用者控件(ASCX)建立使用者控件(ASCX)
在使用者控件(ASCX)建立使用者控件(ASCX)
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)建立使用者控件(ASCX)

接口寫好,去ascx B實作這個接口:

在使用者控件(ASCX)建立使用者控件(ASCX)

我們回到使用者控件ascxA cs代碼頁,去寫按鈕Click的事件:

 ​​

在使用者控件(ASCX)建立使用者控件(ASCX)

上圖中的29行代碼,是判斷檔案框是否為空,是不是為數字。

第35代碼,是動态加載使用者控件ascx B之後,并轉為接口IUserControlable。然後加入PlaceHolder容器中去。

現在,我們建立一個網頁.aspx,在此網頁中,我們引用使用者控件ascxa,還在拉一個铵鈕,和個Literal控件,铵鈕與Literal最開始狀态是隐藏的,主要是用來擷取資料與顯示資料。

在使用者控件(ASCX)建立使用者控件(ASCX)

.aspx.cs代碼:

在使用者控件(ASCX)建立使用者控件(ASCX)
在使用者控件(ASCX)建立使用者控件(ASCX)
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得寫一個接口,這個接口主體隻有一個隻寫屬性。

在使用者控件(ASCX)建立使用者控件(ASCX)

接口寫好了,我們在網頁.aspx.cs實作這個接口。說明白一點,就是網頁的铵鈕隻接受顯示與隐藏,是誰來決定顯示與隐藏,它管不了。

在使用者控件(ASCX)建立使用者控件(ASCX)

具體是誰來控制顯示與隐藏呢,剛才所說,是在使用者控件ascx A的動态産生ascx B之後,這個網頁的Button就顯示。是以,我們去使用者控件ascx a的産生控件代碼中添加:

在使用者控件(ASCX)建立使用者控件(ASCX)

有點疑問,怎樣能把網頁轉為接口呢? 因為我們上面有把網頁實作了IShowable這個接口。

Ok, 我們回到網頁cs,準備寫铵鈕click事件,來擷取資料。不過擷取資料起來,是有點困難,因為動态産生的控件,全是在使用者控件ascx A中呈現,而且每呈現的文本框是來自ascx B。

在網頁中,怎樣擷取俄使用者控件的ascx A的容器PlaceHolder呢? Insus.NET隻會使用接口,是以還是寫另外一個接口,是為了讓網頁.aspx.cs去讀取使用者控件的Ascx A的PlaceHolder。

在使用者控件(ASCX)建立使用者控件(ASCX)

我們去使用者控件ascx A實用這個接口:

在使用者控件(ASCX)建立使用者控件(ASCX)

這樣子,我們就可以在網頁.aspx.cs的擷取值的铵鈕擷取這個容器了。另外,由于容器根據使用者的需求,也許不止單一次産生一個ascx B使用者控件,也許會有好幾個。我們怎樣知道哪一個文本框TextBox是哪一個TextBox呢?

還是寫一個接口吧,

在使用者控件(ASCX)建立使用者控件(ASCX)

接口寫好,我們去ascx B使用者控件來實作這個接口:

在使用者控件(ASCX)建立使用者控件(ASCX)

到現在為止,我們完全可以去網頁代碼中,去寫铵鈕的Click擷取值的事件了:

在使用者控件(ASCX)建立使用者控件(ASCX)

上面代碼中,#0是擷取placeholder容器。

#1是foreach容器中所有文本框。

#2是顯示文本框的值。

到此為止,算是示範完成了。不過,我們還是來一個最終的效果示範吧:

在使用者控件(ASCX)建立使用者控件(ASCX)

Demo source code:

繼續閱讀