动态加载的控件丢失值(ASP.NET)

时间:2009-08-11 23:52:52

标签: asp.net .net-3.5 controls

我有一个关于asp.net应用程序中动态加载控件的奇怪问题。

因此,有一个控件,用户必须选择一些项目和/或做一些文本输入(文本框)。控件取决于单个下拉列表元素。

因此,用户A在此下拉列表“controlselector”中选择某个值 - >将加载许多控件。之后,用户单击“保存”,然后将其保存到数据库中。

问题在于并非所有项目都保存在数据库中。

我在每个Page_Load创建并重新创建控件,我已经在“controlselector”上重新启动了autopost,但控件正在page_load事件中加载。当试图保存元素是空的,但不是每个项目:(

MyCustomControl:
FillElements(someParameter)
{
  //fill some lists, dropdowns, checkboxes or whatever with some values from db
}

Foo Save()
{
   //Save selected input(also some textboxes)
  //and return an object
  return foo;
}

Page:
Page_Load()
{
   PlaceHolder.Clear();

  //with Createpath the path to the control is created and loaded
   PlaceHolder.Controls.Add(LoadControl(CreatePath(Selector.SelectedValue)));

   //some methods are started to fill some lists in the control
   ((MyCustomControl)PlaceHolder.Controls[0]).FillElements(someParameter);
}

Save_Button_Click()
{
    var myFoo = ((MyCustomControl)PlaceHolder.Controls[0]).Save();
    myFoo.DoSomethingElse();
}

似乎有时页面会记住值,有时候不会......奇怪的是一切

谢谢

[编辑] 我看到的问题是,有2次动态填充动作。 1.)决定哪个然后加载自定义控件 2.)使用参数

填充自定义控件

3 个答案:

答案 0 :(得分:3)

Page_Load在生命周期中为时已晚,无法创建动态控件,因为在加载事件之前,状态将恢复为控件。这意味着您需要提前创建控件,否则ASP.Net将无法在恢复状态时看到它。尝试在Init事件中创建它们。或者,更好的是,尝试以下选项之一:

  • 创建一个自定义控件类型,根据需要自行调整,并在页面上显示控件的正常实例。
  • 将所有控件放在页面上,但只为您关注的人设置Visible为真。

答案 1 :(得分:0)

如果您不想重新创建这些控件,则需要检查“IsPostBack”...它会杀死您拥有的值等。

尝试将代码更改为此类代码。

Page_Load()
{
  if(IsPostBack == false){
   PlaceHolder.Clear();

  //with Createpath the path to the control is created and loaded
   PlaceHolder.Controls.Add(LoadControl(CreatePath(Selector.SelectedValue)));

   //some methods are started to fill some lists in the control
   ((MyCustomControl)PlaceHolder.Controls[0]).FillElements(someParameter);
  }
}

答案 2 :(得分:0)

感谢您的帮助,但问题出在完全不同的地方 动态加载到动态加载的下拉列表中的项目有一些“\ n”特殊字符,但不是每个项目 这就是为什么不是每件物品都丢失了几个

我不知道我是否应该/可以将此标记为答案,因为问题出在其他地方