C#動(dòng)態(tài)生成DropDownList執(zhí)行失敗原因分析
本文實(shí)例分析了C#動(dòng)態(tài)生成DropDownList執(zhí)行失敗原因。分享給大家供大家參考。具體如下:
今天研究DDL控件的動(dòng)態(tài)生成的時(shí)候遇到了點(diǎn)問(wèn)題 ,當(dāng)我寫代碼的時(shí)候發(fā)現(xiàn)點(diǎn)擊button后 只能創(chuàng)建一個(gè)DDL控件,再點(diǎn)擊就沒(méi)有作用了,后來(lái)我在里面設(shè)置了變量,看看這個(gè)事件是不是沒(méi)有執(zhí)行,發(fā)現(xiàn)變量并沒(méi)有改變,剛剛有點(diǎn)疑惑不解,后來(lái)發(fā)現(xiàn)當(dāng)我觸發(fā)其它事件的時(shí)候,控件消失了!我想,button的click事件會(huì)回傳,而回傳后新建的控件就會(huì)消失,我才明白,原來(lái)每次都有創(chuàng)建新的控件,只是每次再次點(diǎn)擊button的時(shí)候回傳頁(yè)面,導(dǎo)致之前產(chǎn)生的控件消失了,而那唯一的一個(gè)控件是這次生成的,我又查詢了一下asp的生命周期 看來(lái)對(duì)于頁(yè)面的生命周期理解的不清楚會(huì)出好多問(wèn)題。
簡(jiǎn)單的說(shuō) 頁(yè)面的生命周期分為下面幾個(gè)過(guò)程
1.初始化(Init)
2.控件狀態(tài)的裝載(LoadControlState)
3.視圖裝載(LoadViewState)
4.回傳的數(shù)據(jù)處理(LoadPostData)
5.頁(yè)面加載(OnLoad)
6.渲染(OnPreRender)
7.保存視圖狀態(tài)(SaveViewState)
8.保存控件狀態(tài)(SaveControlState)
9.呈現(xiàn)(Render)
這里當(dāng)我在新點(diǎn)擊button觸發(fā)新建DDL控件的事件的時(shí)候,這個(gè)事件執(zhí)行了,但是上一次創(chuàng)建的控件并沒(méi)有保存狀態(tài),所以出現(xiàn)了上面的問(wèn)題
簡(jiǎn)單研究了一下保存狀態(tài)的方法,就是把狀態(tài)保存到HiddenField中
<body> <form id="form1" runat="server"> <div> <asp:HiddenField ID="hidden" runat="server" /> <asp:Button ID="Btn" runat="server" Text="動(dòng)態(tài)創(chuàng)建" 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>
下面是動(dòng)態(tài)創(chuàng)建code 原理為點(diǎn)擊按鈕 給HiddenField賦值或者可以給ViewState賦值然后再創(chuàng)建控件,這樣再每次進(jìn)入頁(yè)面的時(shí)候,判斷iddenField或者Viewstate是否有值,有就顯示那個(gè)動(dòng)態(tài)創(chuàng)建的控件,這樣就把狀態(tài)保存住了,當(dāng)你再點(diǎn)擊其他控件時(shí),既不會(huì)再消失了。
protected void Page_Load(object sender, EventArgs e)
if (!string.IsNullOrEmpty(Hidden.Value) && Hidden.Value=="flag")
{
CreateDropDownList();
}
if(!isPostBack) //創(chuàng)建控件不能寫在這里,這個(gè)是判斷是否為回發(fā)
{
}
}
protected void Btn_Click(object sender, EventArgs e)//創(chuàng)建控件
{
Hidden.Value = "flag";//這里說(shuō)明已經(jīng)創(chuàng)建過(guò)一個(gè)控件了
CreateDropDownList();
}
接下來(lái)是創(chuàng)建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); //放進(jìn)容器
}
下面為點(diǎn)擊控件 獲得動(dòng)態(tài)創(chuàng)建的控件選中的值 道理也是回發(fā)
protected void GetValue_Click(object sender, EventArgs e)
{
DropDownList ddl = PanelControl.FindControl("ddl") as DropDownList;
if (ddl != null)
{
lbl.Text ="點(diǎn)擊按鈕得到的值為"+ddl.SelectedValue;
}
}
動(dòng)態(tài)創(chuàng)建的ddl的事件
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl= sender as DropDownList;
if (ddl != null)
{
lbl.Text ="通過(guò)自身回發(fā)事件得到的值為"+ddl.SelectedValue;
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- 基于Jquery的將DropDownlist的選中值賦給label的實(shí)現(xiàn)代碼
- 深入DropDownList用法的一些學(xué)習(xí)總結(jié)分析
- ASP.NET DropDownListCheckBox使用示例(解決回發(fā)問(wèn)題)
- DropDownList綁定數(shù)據(jù)表實(shí)現(xiàn)兩級(jí)聯(lián)動(dòng)示例
- DropDownList獲取的SelectIndex一直為0的問(wèn)題
- ASP.NET MVC中為DropDownListFor設(shè)置選中項(xiàng)的方法
- JS簡(jiǎn)單操作select和dropdownlist實(shí)例
- DropDownList設(shè)置客戶端事件思路
- 解決DropDownList總是選中第一項(xiàng)的方法
相關(guān)文章
C#中string和StingBuilder內(nèi)存中的區(qū)別實(shí)例分析
這篇文章主要介紹了C#中string和StingBuilder內(nèi)存中的區(qū)別,以實(shí)例形式演示了二者在內(nèi)存中的不同之處,需要的朋友可以參考下2014-09-09
C#調(diào)用AForge實(shí)現(xiàn)攝像頭錄像的示例代碼
這篇文章主要介紹了C#調(diào)用AForge實(shí)現(xiàn)攝像頭錄像的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
C# Newtonsoft自定義JsonConverter的實(shí)現(xiàn)
本文介紹了在C#中使用Newtonsoft庫(kù)進(jìn)行JSON對(duì)象和字符串的序列化與反序列化,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03

