如何坚持动态控制(c#)

时间:2011-04-06 14:08:43

标签: c# asp.net dynamic-controls

根据标题,我创建了一个自定义控件。

在某个按钮单击事件中,将实例化此控件,然后将其添加到页面中。

这是一个动态控件,它有自己的按钮事件。

为了触发这些按钮事件,必须在Page_Load / OnLoad的末尾,在随后的page_load / onload生命周期阶段绘制控件。

我的问题是如何坚持这种控制?我无法将其存储在Session对象中,因为它包含不可序列化的项目。

4 个答案:

答案 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)