【问题标题】:How to get a changed value from dynamic control after postback C#回发C#后如何从动态控件中获取更改的值
【发布时间】:2013-11-19 21:36:16
【问题描述】:

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

控件保持在视图状态中的属性

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

然后是一个方法,当我单击编辑按钮以从文字更改为文本框时将创建控件。

    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 之前所说,我唯一需要的是在加载事件中重新创建对象。不仅仅是 init 解决了我的问题。我不再需要视图状态了

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

【问题讨论】:

    标签: c# dynamic controls viewstate placeholder


    【解决方案1】:

    您应该在每个postback 上的Page_Init 方法中创建动态控件。在这种情况下,创建的控件可能会成功恢复其视图状态。

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

    【讨论】:

    • 事实上,控件的创建和视图状态的存储是当我点击一个编辑按钮,以便从文字变为文本框时
    • 您可以添加一些指示符来将您的控件创建为 html 隐藏字段,并在 Page_Init 的 Request.From 集合中检查此隐藏字段值以重新创建您的控件。
    • 你能举个例子吗?如何将更改的值从动态控件存储到隐藏而不回发。 Javascript?控制的类型很多。
    • 我在答案中添加了一些示例
    • 如果我不清楚,我很抱歉。我总是会得到 value = "1" 的问题是,一旦页面使用文本框控件呈现并且来自 DB 的 value = "1" 然后有人用键盘键入新值作为 "2"。我想存储或保留新值 2 而不是 1。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2011-05-04
      • 2011-09-01
      • 2011-03-14
      相关资源
      最近更新 更多