1. 程式人生 > >關於動態載入控制元件 事件觸發的問題

關於動態載入控制元件 事件觸發的問題

由於Web的"無狀態"本質,ASP.NET (Web Forms)專案動態載入使用者控制元件需要注意一些問題:

1. 在頁面的每次Postback,都要重新建立動態載入的使用者控制元件

2. 若需要維護動態使用者控制元件的狀態(ViewState)或者事件,在每次載入時,使用相同的ID。

 MSDN上提供了一種參考的方式,override頁面的LoadViewState方法,因為該方法呼叫是在page_load事件之前,它可以保證這些動態控制元件在事件處理函式裡面是可用的。下面是一個很簡單的例子,例子很簡單,頁面上動態新增10個textbox,在viewstate裡面儲存一個標誌位,表示是否動態添加了這些控制元件,在LoadViewState函式裡進行判斷,如果有這個標誌,則重新載入這些控制元件。

3,下面是一個例子

public partial class LoginPage : System.Web.UI.Page
    {
       HtmlInputText username;
       HtmlInputPassword pwd;
       HtmlInputButton submit;
       HtmlInputButton cancel;
       HtmlGenericControl show;
        protected void Page_Load(object sender, EventArgs e)
        {
           
            username = new HtmlInputText("text");
            pwd = new HtmlInputPassword();
            submit = new HtmlInputButton("submit");
            submit.Value = "提交";

            submit.ServerClick += new EventHandler(submit_ServerClick);//繫結事件
            cancel = new HtmlInputButton();
            cancel.Value = "取消";
            show = new HtmlGenericControl("span");

            HtmlTable table = new HtmlTable();  //四行的表格
            HtmlTableRow row1 = new HtmlTableRow();
            HtmlTableRow row2 = new HtmlTableRow();
            HtmlTableRow row3 = new HtmlTableRow();
            HtmlTableRow row4 = new HtmlTableRow();
            table.Rows.Add(row1);               //行新增到表格裡
            table.Rows.Add(row2);
            table.Rows.Add(row3);
            table.Rows.Add(row4);
            HtmlTableCell cell1 = new HtmlTableCell(); //定義單元格
            cell1.ColSpan = 2;
            row1.Cells.Add(cell1);
            HtmlTableCell cell2 = new HtmlTableCell();
            cell2.ColSpan = 2;
            row2.Cells.Add(cell2);
            HtmlTableCell cell3_1 = new HtmlTableCell();
            HtmlTableCell cell3_2 = new HtmlTableCell();
            row3.Cells.Add(cell3_1);
            row3.Cells.Add(cell3_2);
            HtmlTableCell cell4 = new HtmlTableCell();
            cell4.ColSpan = 2;
            row4.Controls.Add(cell4);
           

            cell1.Controls.Add(username);
            cell2.Controls.Add(pwd);
            cell3_1.Controls.Add(submit);
            cell3_2.Controls.Add(cancel);
            cell4.Controls.Add(show);

            HtmlGenericControl div = new HtmlGenericControl("div");
            div.Style["Position"] = "absolute";
            div.Style["left"] = "360px";
            div.Style["top"] = "230px";
            div.Style["border-style"] = "solid";
            div.Style["border-width"] = "1px";
            div.Style[HtmlTextWriterStyle.Padding] = "20px";

            div.Controls.Add(table);
            this.form1.Controls.Add(div);
            
        }

        void submit_ServerClick(object sender, EventArgs e)
        {
            if (username.Value == "張三" && pwd.Value == "123456")
                {
                    Response.Redirect("http://www.baidu.com/");
                }
                else
                {
                    show.Style["color"] = "red";
                    show.Style[HtmlTextWriterStyle.FontSize] = "14px";
                    show.InnerHtml = "使用者名稱或密碼錯誤!";
                }
        }
    }