如何在回发C#后从动态控件中获取更改的值

时间:2013-11-19 21:36:17

标签: c# dynamic controls viewstate placeholder

我最近创建了一个控件,它将为占位符创建动态控件,因此为了保留此控件,我将其存储到viewstate中,然后在回发中重新创建它。实际上它正在工作但是如何从这个控件中保存新的更改值,因为在回发后给了我相同的值。

要在视图中保存控件的属性

    public Control MyControl
    {
        get
        {
            return (Control)ViewState["MyControl"] ?? null;
        }
        set
        {
            this.ViewState["MyControl"] = value;
        }
    }

然后是一个方法,当我点击编辑按钮以便从Literal更改为TextBox时将创建控件。

    private void CreateControl()
    {
        Control ctrl = new TextBox();
        this.MyControl = ctrl;
        this.BindValue(ctrl); //Bind the value from DB Text = "1"
        this.placeHolder.Controls.Add(ctrl);
    }

然后控件将显示值“1”然后我更改为“2”然后单击按钮以保存更改

    protected void btnSave_Click(object sender, ImageClickEventArgs e)
    {
        string value = String.Empty;
        Control ctrl = this.MyControl;
        if (ctrl is TextBox)
        {
            //I want here the value of 2 but I get 1 again
            value = ((TextBox)ctrl).Text;
        }
        //Save operation into DB
    }

-----编辑-----

我唯一需要的就是在Dmytro Rudenko之前说过,在load事件上重新创建对象。不仅仅是init还是没有解决我的问题。我不再需要视图状态了

    protected override void OnLoad(EventArgs e)
    {
            Control ctrl = this.CreateControl();
            this.placeHolder.Controls.Add(ctrl);
    }

2 个答案:

答案 0 :(得分:1)

您应该在每个Page_Init上使用postback方法创建动态控件。在这种情况下,创建的控件可以成功恢复其viewstate。

  1. 在表单中添加隐藏字段:

    <input type="hidden" name="recreate" value='<%= ViewBag["recreate"] %>' />
    
  2. 添加控件

    private void CreateControl()
      {
        Control ctrl = new TextBox();
        this.DynamicControl = ctrl;
        this.BindValue(ctrl); //Bind the value from DB Text = "1"
        this.placeHolder.Controls.Add(ctrl);
        ViewBag["recreate"] = "1";
      }        
    
  3. 重新创建控件

    protected Page_Init(object sender, EventArgs e)
     {
       if (Request.Form["recreate"] != null && Request.Form["recreate"] == "1")
        {
           CreateControl();
        }    
      }
    

答案 1 :(得分:0)

该值未保存在ViewState中。当单击btnSave按钮时,页面会重新将控件添加到页面,之前,保存按钮事件将触发。因此,您的CreateControl()方法在btnSave事件之前触发,并且“1”值正在重新加载到新创建的控件中。在您的方法中,您需要区分何时希望将该值绑定到控件,使用!IsPostback或通过应用程序所需的其他方法。

我使用了一个变量来描述导致回发的原因;如果回发基于菜单单击,则页面重新添加所有控件,然后将相应的控件绑定到数据库。如果回发是由下拉列表或网格视图页面引起的,那么页面会重新添加控件,但不会将它们绑定到数据库,以便保留其输入值。但是,有不同的方法可以做到这一点,而且,它还取决于您的应用需求。