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

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

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

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

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

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

您应该在每次回发时重新创建动态控件。 最好的方法是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; } 

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

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

这是我的头脑,所以我可能会有一些细节。

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

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

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