本文實例分析了C#動態生成DropDownList執行失敗原因。分享給大家供大家參考。具體如下:
今天研究DDL控件的動態生成的時候遇到了點問題 ,當我寫代碼的時候發現點擊button后 只能創建一個DDL控件,再點擊就沒有作用了,后來我在里面設置了變量,看看這個事件是不是沒有執行,發現變量并沒有改變,剛剛有點疑惑不解,后來發現當我觸發其它事件的時候,控件消失了!我想,button的click事件會回傳,而回傳后新建的控件就會消失,我才明白,原來每次都有創建新的控件,只是每次再次點擊button的時候回傳頁面,導致之前產生的控件消失了,而那唯一的一個控件是這次生成的,我又查詢了一下asp的生命周期 看來對于頁面的生命周期理解的不清楚會出好多問題。
簡單的說 頁面的生命周期分為下面幾個過程
1.初始化(Init)
2.控件狀態的裝載(LoadControlState)
3.視圖裝載(LoadViewState)
4.回傳的數據處理(LoadPostData)
5.頁面加載(OnLoad)
6.渲染(OnPreRender)
7.保存視圖狀態(SaveViewState)
8.保存控件狀態(SaveControlState)
9.呈現(Render)
這里當我在新點擊button觸發新建DDL控件的事件的時候,這個事件執行了,但是上一次創建的控件并沒有保存狀態,所以出現了上面的問題
簡單研究了一下保存狀態的方法,就是把狀態保存到HiddenField中
<body> <form id="form1" runat="server"> <div> <asp:HiddenField ID="hidden" runat="server" /> <asp:Button ID="Btn" runat="server" Text="動態創建" onclick="Btn_Click" /> <asp:Button ID="GetValue" runat="server" Text="獲取選中的值" onclick="GetValue_Click" /> <asp:Label ID="lbl" runat="server" Text=""></asp:Label> <asp:Panel ID="PanelControl" runat="server"> </asp:Panel> </div> </form></body>
下面是動態創建code 原理為點擊按鈕 給HiddenField賦值或者可以給ViewState賦值然后再創建控件,這樣再每次進入頁面的時候,判斷iddenField或者Viewstate是否有值,有就顯示那個動態創建的控件,這樣就把狀態保存住了,當你再點擊其他控件時,既不會再消失了。
protected void Page_Load(object sender, EventArgs e)if (!string.IsNullOrEmpty(Hidden.Value) && Hidden.Value=="flag"){ CreateDropDownList();}if(!isPostBack) //創建控件不能寫在這里,這個是判斷是否為回發 {}}protected void Btn_Click(object sender, EventArgs e)//創建控件{ Hidden.Value = "flag";//這里說明已經創建過一個控件了 CreateDropDownList();}
接下來是創建ddl的基本代碼
private void CreateDropDownList(){ DropDownList ddl = new DropDownList(); ddl.ID = "ddl"; ddl.Items.Add(new ListItem("1", "1")); ddl.AutoPostBack = true; ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged); //給ddl添加事件 PanelControl.Controls.Add(ddl); //放進容器}
下面為點擊控件 獲得動態創建的控件選中的值 道理也是回發
protected void GetValue_Click(object sender, EventArgs e){ DropDownList ddl = PanelControl.FindControl("ddl") as DropDownList; if (ddl != null) { lbl.Text ="點擊按鈕得到的值為"+ddl.SelectedValue; }}
動態創建的ddl的事件
protected void ddl_SelectedIndexChanged(object sender, EventArgs e){ DropDownList ddl= sender as DropDownList; if (ddl != null) { lbl.Text ="通過自身回發事件得到的值為"+ddl.SelectedValue; }}
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答