[ASP.NET]動態新增User Control,並設定屬性值與取屬性值
User Control是一個很特別的東西,常寫Custom Control之後,反而要動態加User Control有點綁手綁腳的。
只依稀記得要用特別的方式載入。
上網找了一下解答,果然還是有不少熟面孔的解答,解決了我的疑惑,這邊就順便做個記錄。
參考文章:UserControl動態產生並傳值
感謝小朱提供的解決方法。
這邊就拿之前的包好的Control來做個示範。
Step1:
新增一個UserControl叫做CustIDName.ascx。裡面有兩個textbox,一個為ID,一個為Name。
並將CustID與CustName屬性public出來。
ascx:
<%@ Register Assembly="Joey" Namespace="Joey" TagPrefix="cc1" %>
<cc1:JoeyTextBox ID="JoeyTextBox1" runat="server" DataType="CustID" MessageParameter="ID" />
<cc1:JoeyTextBox ID="JoeyTextBox2" runat="server" MessageParameter="Name" />.ascx.cs
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class UserControl_CustIDName : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    public string CustID
    {
        get
        { return this.JoeyTextBox1.mTextBox.Text; }
        set
        { this.JoeyTextBox1.mTextBox.Text = value; }
    }
    public string CustName
    {
        get
        { return this.JoeyTextBox2.mTextBox.Text; }
        set
        { this.JoeyTextBox2.mTextBox.Text = value; }
    }
    public string ValidationGroup
    {
        get
        { return this.JoeyTextBox1.ValidationGroup; }
        set
        { 
            this.JoeyTextBox1.ValidationGroup = value;
            this.JoeyTextBox2.ValidationGroup = value; 
        }
    }
}Step2:
接著我們在一個空白頁面上,加入一個panel,希望在這個panel裡面,動態加入10個CustIDName的User Control。
透過一個DropDownList選取第N個User Control,並將ID與Name assign至TextBox1與TextBox2上。
.aspx
<%@ Register Src="UserControl/CustIDName.ascx" TagName="CustIDName" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>未命名頁面</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>
        <asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="true">
        </asp:DropDownList>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>        
        
    </div>
    </form>
</body>
</html>.cs
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class LoopAddUserControl : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.DropDownList1.Items.Add(new ListItem("user control index"));
            for (int i = 0; i < 10; i++)
			{                
                this.DropDownList1.Items.Add(new ListItem(i.ToString()));
			}            
        }
        for (int index = 0; index < 10; index++)
        {
            Control ctlNewTrial = this.Page.LoadControl("UserControl/CustIDName.ascx");
            SetUserControlProperty(ctlNewTrial, "ID", "Usrctrl" + index.ToString());
            SetUserControlProperty(ctlNewTrial, "CustID", index.ToString());
            SetUserControlProperty(ctlNewTrial, "CustName", index.ToString()+":name");
            this.Panel1.Controls.Add(ctlNewTrial);
            Label br = new Label();
            br.Text = "index=" + index.ToString()+ "<br/>";
            this.Panel1.Controls.Add(ctlNewTrial);
            this.Panel1.Controls.Add(br);
        }
    }
    /// <summary>
    /// 設定user control的屬性值
    /// </summary>
    /// <param name="vobjControl">usercontrol by page.loadcontrol()</param>
    /// <param name="vstrPropertyName">usercontrol's property</param>
    /// <param name="vobjValue">setting property value</param>
    /// <remarks></remarks>
    public void SetUserControlProperty(Control vobjControl, string vstrPropertyName, object vobjValue)
    {
        vobjControl.GetType().GetProperty(vstrPropertyName).SetValue(vobjControl, vobjValue, null);
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {        
        ASP.usercontrol_custidname_ascx usrctl1 = (ASP.usercontrol_custidname_ascx)this.Panel1.FindControl("Usrctrl" + this.DropDownList1.SelectedValue);
        if (usrctl1 != null)
        {
            this.TextBox1.Text = usrctl1.CustID;
            this.TextBox2.Text = usrctl1.CustName;
        }
        else
        {
            this.TextBox1.Text = string.Empty;
            this.TextBox2.Text = string.Empty;
        }
    }
}
Step3:
大功告成,接著來 看一下執行的畫面。
DropDownList選2,則出現:
我們再將5的ID與Name改成,JoeyID與JoeyName,index再選5:
希望對大家使用User Control上會有幫助。
blog 與課程更新內容,請前往新站位置:http://tdd.best/
