WebPart 中DropDownList 丢失状态 的解决方案

来源:互联网 发布:如何做好淘宝店铺推广 编辑:程序博客网 时间:2024/05/24 04:46

最近比较忙,忙的都没时间更新博客了.

所以今天要一口气写两篇.

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;
                        }
                    }
         }