从集合中间删除动态创建的控件

时间:2017-10-27 14:45:20

标签: c# asp.net webforms

也许我正在借用麻烦,但我已经动摇了我的脑袋动态创建控件。我正在构建一个表单,允许用户输入任意数量的数据行。

我有基于按钮点击创建控件的方法,并且我知道只要我的控件在每个PostBack上具有相同的ID,ViewState就会用PostBack之前的数据填充它们。

我的问题是:假设用户已添加5行并将其填满。决定删除第3行。最简单的方法是只调用parent.Controls.Remove("ID")。这是否会更新ViewState,以便我可以将我的计数器减1并将其余控件从0重新编号为3或者我是否需要跟踪哪一个被删除并保持编号0,1,3,4?

我是否必须做一些事情来清除已删除控件的ViewState记录?

1 个答案:

答案 0 :(得分:1)

开发 ASP.NET Forms 应用程序时,只要您在 ASP.NET Forms 的上下文中操作页面加载 post-backs 之间的框架和对象您将是安全的。尽管如此,如果不添加自定义代码,有时也会遇到挑战。在后面的代码中处理它是最好的地方,用于动态地向页面添加控件。

当您删除控件时, ViewState 应该在您调用{时直接在控件上使用 ASP.NET Forms 方法时自动更新{1}}。如果您是自定义命名控件,则需要自己提供所有ID或名称,以便它们与页面不同。所以在这里我假设你有自定义命名控件,并知道为parent.Controls.Remove("ID")真正实现了什么。

就编码而言, ViewState 对您来说通常是透明的。有时您可能会发现自己在回发之间("ID")手动清除 ViewState ViewState 也可以转为like for a form with a password, when every visit to the page you need to clear the value,因此请考虑是否 或者您的应用程序需要 ViewState 的额外开销。在动态表单上,我会尽力在后面的代码中添加控件或数据绑定到自定义数据源。原因是注册客户端脚本,因此 ASP.NET Forms 框架知道脚本,处理自定义id属性或命名方案客户端可能很难调试或处理绑定立场。

我个人已经将 ASP.NET Forms 应用程序与 AngularJS 1.6 集成在一起,虽然它比使用 ASP.NET MVC更加困难,需要更多配置,它仍然是可能的,并为我提供了一个很好的方法来构建ASP.NET的动态表单。但是,在后面的代码中绑定回您的表单值需要查找并从off中获取值。如果以这种方式完成,您的表单在 ASP.NET 外部,那么这些对象将有 ViewState

  

这是否会更新ViewState,以便我可以将我的计数器减1并将剩余的控件从0重新编号为3,或者我是否需要跟踪哪一个被删除并保留编号0,1,3,4 ?


至于你在这里提到的策略,代码示例将是最有帮助的。我必须在那里做出很多假设来猜测可能会发生什么。我可以告诉你它没关系,但你仍然可能遗漏一些影响你个人成果的结果。删除行时,它将自动更新 ViewState 。至于跟踪你如何用不同的值命名你的控件ID的编号方案,我个人在数字中留下差距,所以坚持{{ 1}},它应该简化你的代码,你不必在后面的代码中跟踪,也不会影响你的渲染逻辑。通过这种方式,控件可以在 post-back 期间唯一地绑定到您的代码后面,并且您可以轻松地遍历控件集合,而无需担心命名方案。