动态添加控件时出错

时间:2012-08-03 06:39:37

标签: asp.net webforms viewstate dynamic-controls

我有UserControl。我动态创建了一些控件(SPGridView的列。在ObjectDataSource方法中添加了标记ButtonLabelCreateChildControl)中的网格控件并添加到Controls集合。在回发中添加了其中两个控件(ButtonLabel),但其中一个(MenuTemplate)使用此类内容引发异常:

  

无法加载viewstate。视图状态所在的控制树   正在加载必须与用于保存的控制树匹配   在上一个请求期间查看状态。例如,添加时   动态控制,回发期间添加的控件必须匹配   初始期间添加的控件的类型和位置   请求。

当我将代码移动到OnInit方法时,所有控件都成功添加。所以,我有一个问题:有人可以解释一下为什么有些控件成功添加到Controls集合中而其他控件在回发中CreateChildControls失败了吗?我已阅读有关ViewState here的内容。可能我不明白某些时刻。

看看我的代码:

protected override void CreateChildControls()
{

 Label l = new Label();
 l.ID = "labelTest";
 l.Text = "Hello test!";

 Button b = new Button();
 b.Text = "Press test";
 b.ID = "buttonTest";
 b.Click += b_Click;

 Controls.Add(l);
 Controls.Add(b);

 ObjectDataSource gridDataSource = new ObjectDataSource();
 gridDataSource.ID = "gridDataSource";
 gridDataSource.SelectMethod = "GetDataSource";
 gridDataSource.TypeName = this.GetType().AssemblyQualifiedName;

 Controls.Add(gridDataSource);

 SPMenuField colMenu = new SPMenuField();
 colMenu.HeaderText = "Test";
 colMenu.TextFields = "Test";
 colMenu.MenuTemplateId = "ListMenu";

 // it is my SPGridView that added in markup
 customGridView.Columns.Add(colMenu);

 MenuTemplate titleListMenu = new MenuTemplate();
 titleListMenu.ID = "ListMenu";

 // The exception occurs here
 Controls.Add(titleListMenu);

 base.CreateChildControls();
}

1 个答案:

答案 0 :(得分:0)

我认为,您只能在Page_Load或其他事件中(即在Page_Init之后)将项目添加到模板中,以便它将保留在回发中,而不是模板本身。模板需要在Page_Init之前或之后创建阶段,否则它可能无法从viewstate将控件加载到该模板中,或者可能导致错误。