ASP.NET,使用 .Controls.Add() 添加的控件在页面回发时丢失,如果我使用 .InnerHtml 添加它们,我无法引用它们

Posted

技术标签:

【中文标题】ASP.NET,使用 .Controls.Add() 添加的控件在页面回发时丢失,如果我使用 .InnerHtml 添加它们,我无法引用它们【英文标题】:ASP.NET, controls added using .Controls.Add() are lost when page is posted back & if I add them using .InnerHtml I can't reference them 【发布时间】:2011-07-06 13:49:16 【问题描述】:

我正在尝试制作一个 cmets 页面。我从数据库中获得了以前制作的 cmets,并且有一个文本框用于提交新评论。因此,为了显示数据库中的旧 cmets,必须动态添加它们,对吗?起初我使用类似:TheContainerControl.Controls.Add(TheComment),但事实证明,当页面被回发(提交新评论或其他内容)时,我动态添加的所有内容都消失了! 为了解决这个问题,我改用了 TheContainerControl.Innerhtml("[html]") 。这样,当页面回发时,我动态添加的控件不会丢失。但是,我现在已经搜索了将近九到十个小时,以寻找一种将事件处理程序添加到我通过 .InnerHtml 添加的控件的方法,但我没有找到任何东西:(我根本无法引用它们,.FindControl( ) 返回一个空引用。我还尝试手动插入将触发事件的代码/脚本,但惨遭失败(我是 jQuery 新手,我对 javascript 知之甚少)。如果可以,请提供帮助。

【问题讨论】:

【参考方案1】:

改用Repeater、GridView或ListView之类的控件会更容易,这些控件是为显示动态数量的cmets而构建的。

需要在每次回发时将动态控件添加回页面。

我不确定你的意思是什么:“我一直在寻找近九到十个小时来寻找一种将事件处理程序添加到我通过 .InnerHtml 添加的控件的方法,但我没有找到任何东西 :(我根本无法引用它们,.FindControl() 返回一个空引用。我还尝试手动插入将触发事件的代码/脚本,但惨遭失败“-JQuery 如何适应这一点,您是否尝试在客户端或服务器上执行此操作?

HTH。

【讨论】:

【参考方案2】:

您在页面上添加回这些旧的 cmets,这些 UI 元素是响应 DOM 事件(如单击等)还是它们只是用于显示的标签?如果它们只是用于显示,那么正如 Brian 上面所说,您最好使用 Repeater r GridView 或 ListView 而不是动态控件。

实际上,即使它们是控件元素,您仍然可以将它们放在 GridView 的模板列中,并让它处理分页等。您可以使用 jQuery 实时事件来处理这些控件。

或者使用 ASP.NET Ajax 和更新面板仅刷新页面中绝对需要在回发时刷新的部分,而其他部分保持不变。

如果你能发布一些代码会很有帮助。

【讨论】:

【参考方案3】:

在向页面动态添加控件时,在 Asp.net 中必须牢记的是page life cycle。何时可以添加控件并在下一次回发后仍然保留它们是非常特别的。或者您可以添加控件并让它们渲染到多晚。

人们动态构建页面的常见趋势是刚开始将他们的代码放在 Page_Load() 中,但这在生命周期中为时已晚。你可能想试试Init(或Page_Init)。

正如其他人所建议的,您也可以考虑根本不动态添加控件,而是使用一些内置的 Asp.net 内容控件来管理页面的动态状态。当来自其他 Web 框架/技术时,您可以动态构建页面,Asp.net 可能看起来有点复杂。 请记住 - 一旦您学会了利用页面生命周期和 Asp.net 控件,您就不必自己手动管理页面上所有元素的状态。

【讨论】:

以上是关于ASP.NET,使用 .Controls.Add() 添加的控件在页面回发时丢失,如果我使用 .InnerHtml 添加它们,我无法引用它们的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 代码隐藏错误创建 ASP.NET 控件

动态添加的页脚不会停留在 ASP.NET 页面的底部

jQuery .each 函数

c# winform 控件层次问题

C# MDI 简单实现

窗体中添加控件与窗体显示和隐藏