2

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

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

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

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

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

4

4 回答 4

3

通常对于动态控件,必须在每次回发时添加它们,并且每次都需要连接事件。

于 2011-04-06T14:11:39.467 回答
2

You should recreate dynamic controls on every postback. The best place to do that is method CreateChildControls.

To add dynamically control after button click set in click handler some flag (persistent flag - so it should be in viewstate or in sessionstate) - it should indicate that on next page creation your control should be added to it. After this you should set ChildControlsCreated = false;
After this CreateChildControls are executed again and your control is created correctly and is persistent (till you not clear flag).

So it should be done in this way:

protected override void CreateChildControls()
{
        base.CreateChildControls();
    if (ViewState["AddControl"] == true)
        {
         Controls.Add(new MyControl() {Id = "someId" });
        }
}

And btn handler

private void OnShowControlClick(object sender, EventArgs e)
{
         ViewState["AddControl"] = true;
         ChildControlsCreated = false;
}
于 2011-04-06T14:17:27.770 回答
0

我相信您需要做的就是在预初始化期间使用相同的 ID 重新创建它,并且 asp.net 引擎将从视图状态填充它。

这不在我的脑海中,所以我可能会稍微了解一下细节。

于 2011-04-06T14:11:22.467 回答
0

与所有 HTML 页面一样,必须在每个页面请求上重新创建控件。ASP.NET 使用 ViewState 和 Session 等机制处理了很多这种“幕后”。

如果 ViewState 没有(或不能)跟踪您的控件,那么您需要自己处理。

我不知道您的控件有多复杂,但作为起点,您可能希望在此处阅读处理 CreateChildControls 事件 (MSDN)

于 2011-04-06T14:14:24.473 回答