根据标题,我创建了一个自定义控件。
在某个按钮单击事件中,将实例化此控件,然后将其添加到页面中。
这是一个动态控件,它有自己的按钮事件。
为了触发这些按钮事件,必须在Page_Load
/ OnLoad
的末尾,在随后的page_load / onload生命周期阶段绘制控件。
我的问题是如何坚持这种控制?我无法将其存储在Session
对象中,因为它包含不可序列化的项目。
答案 0 :(得分:3)
通常对于动态控件,必须在每次回发时添加它们,并且每次都需要连接事件。
答案 1 :(得分:2)
您应该在每次回发时重新创建动态控件。最好的方法是方法CreateChildControls
。
要在按钮单击设置中添加动态控件,请单击处理程序中的一些标志(持久标志 - 因此它应该在viewstate或sessionstate中) - 它应该指示在下一页创建时应该将控件添加到它。在此之后,您应该设置ChildControlsCreated = false;
在再次执行CreateChildControls之后,您的控件被正确创建并且是持久的(直到您不清除标记)。
所以它应该以这种方式完成:
protected override void CreateChildControls()
{
base.CreateChildControls();
if (ViewState["AddControl"] == true)
{
Controls.Add(new MyControl() {Id = "someId" });
}
}
和btn处理程序
private void OnShowControlClick(object sender, EventArgs e)
{
ViewState["AddControl"] = true;
ChildControlsCreated = false;
}
答案 2 :(得分:0)
我相信您需要做的就是在初始化期间使用相同的ID重新创建它,并且asp.net引擎将从视图状态填充它。
这不是我的头脑,所以我可能会稍微详细说明一下。
答案 3 :(得分:0)
与所有HTML页面一样,必须在每个页面请求上重新创建控件。 ASP.NET使用ViewState和Session等机制处理了很多“幕后”。
如果ViewState没有(或不能)跟踪您的控件,那么您需要自己处理。
我不知道您的控件有多复杂,但作为起点,您可能希望了解处理CreateChildControls事件here (MSDN)