最近比較忙,忙的都沒時間更新部落格了.
所以今天要一口氣寫兩篇.
WebPart 中DropDownList 丟失狀態 的解決方案,十分頭痛.
現象就是DropDownList老是為空白.
當時有些暈,上網搜了好久,要麼沒答案,要麼含糊其詞。
當有些網友說用HiddenField 儲存狀態給我一些啟發,於是我朝HiddenField的方向去想。
原理:HiddenField的是可以直接反映到用戶端的且狀態值不丟失,用HiddenField的值記錄DropDownList的ClientID.
而DropDownList在用戶端反映為ID為ClientID的Select域的Form成員。然後當提交時在伺服器端獲得ID為ClientID的Select域的Form成員
的值即為DropDownList的選中值。
1、用HiddenField的值記錄DropDownList的ClientID
private DropDownList DlistMember = new DropDownList();
private TextBox txtCNName = new TextBox();
private Button btnOnboard = new Button();
private Label lblMessage = new Label();
private HiddenField hiddenFiled = new HiddenField();
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
//填充 DlistMember 的資料
DlistMember.RenderControl(writer)
btnOnboard.Click += new EventHandler(btnOnboard_Click);
txtCNName.RenderControl(writer);
txtCNName.AutoPostBack = false;
btnOnboard.RenderControl(writer);
lblMessage.RenderControl(writer);
hiddenFiled.Value = DlistMember.ClientID;
hiddenFiled.RenderControl(writer);
}
protected override void CreateChildControls()//為了加上btnOnboard的Click事件
{
btnOnboard.Click += new System.EventHandler(this.btnOnboard_Click);
DlistMember.EnableViewState = true;
//DlistMember.EnableTheming = true;
//DlistMember.AutoPostBack = true;
this.Controls.Add(DlistMember);
this.Controls.Add(btnOnboard);
this.Controls.Add(hiddenFiled);
}
2、事件處理
protected void btnOnboard_Click(object sender, EventArgs e)// process btnOnboard click
{
string strValue="";
strValue = hiddenFiled.Value.ToString().Replace("$","_");
for (int i = 0; i < this.Page.Request.Form.Count; i++)//因為$和_的混淆,這裡用遍曆Form的域來找到需要的域
{
string strTemp = this.Page.Request.Form.Keys[i].ToString().Replace("$", "_");
if (strTemp == strValue)
{
strValue = this.Page.Request.Form[i].ToString();
isFindFrom = true;
break;
}
}
}