我最近创建了一个控件,它将为占位符创建动态控件,因此为了保留此控件,我将其存储到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);
}
答案 0 :(得分:1)
您应该在每个Page_Init
上使用postback
方法创建动态控件。在这种情况下,创建的控件可以成功恢复其viewstate。
在表单中添加隐藏字段:
<input type="hidden" name="recreate" value='<%= ViewBag["recreate"] %>' />
添加控件
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";
}
重新创建控件
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或通过应用程序所需的其他方法。
我使用了一个变量来描述导致回发的原因;如果回发基于菜单单击,则页面重新添加所有控件,然后将相应的控件绑定到数据库。如果回发是由下拉列表或网格视图页面引起的,那么页面会重新添加控件,但不会将它们绑定到数据库,以便保留其输入值。但是,有不同的方法可以做到这一点,而且,它还取决于您的应用需求。