我有一个用户控件,需要在单击按钮时加载子控件。 麻烦的是它必须从另一个类请求控制。
所以在按钮点击事件中,我调用该函数来获取我的控件,然后将其添加到页面中,如下所示:
UserControl ctrl = ExampleDataProvider.GetControl(some params...);
myDetailPane.Controls.Add(ctrl);
GetControl方法如下所示:
public static UserControl GetControl(some params...)
{
ExampleDetailPane ctrl = new ExampleDetailPane();
ctrl.Value = "12";
ctrl.Comment = string.Empty;
return ctrl;
}
由于页面的生命周期,这不起作用 - 子控件的Page_Load被触发,其控件为空。
我很清楚我的方法是错误的,为什么,但不知道解决它的最佳方法!有人可以帮忙吗?
答案 0 :(得分:7)
必须在每次回发时重新创建动态控件,此Article是关于如何保持动态控件及其状态的良好链接。
答案 1 :(得分:2)
在Page_Init
中创建您的控件。然后在Button_Click
事件中显示。
(CTRL + C / CTRL + V来自我上周回答的其他一些问题):
页面周期之间必须维护的所有内容都应在Page_Init
中声明,而不是Page_Load
。
所有初始化(如添加事件处理程序)和添加控件都应在初始化期间添加,因为状态是在页面循环之间保存的。使用控件和视图状态的内容进行处理应在Load
。
同时检查http://msdn.microsoft.com/en-us/library/ms178472.aspx。
<强>初始化强>
在初始化所有控件和任何皮肤后引发 设置已应用。用这个 读取或初始化控件的事件 属性。
<强>加载强>
Page调用OnLoad事件方法 在页面上,然后递归地执行 对于每个儿童控制都是一样的 为每个孩子做同样的事情 控制直到页面和所有 控件已加载。
使用OnLoad事件方法进行设置 控制和建立的属性 数据库连接。
答案 2 :(得分:1)
两种可能的方法:
答案 3 :(得分:1)
如果要在PostBack中访问控件或想要绑定Event,则必须在CreateChildControls()方法中创建它们。
private UserControl _uc = null;
/// <summary>
/// Creates all controls.
/// </summary>
/// <remarks>All the controls must be created in this method for the event handler</remarks>
protected override void CreateChildControls()
{
_uc = new UserControl ();
this.Controls.Add(_uc);
base.CreateChildControls();
}