【问题标题】:Dynamically Removing Controls from Update Panel.从更新面板中动态删除控件。
【发布时间】:2015-10-03 10:49:57
【问题描述】:

我有一个更新面板,我需要删除我动态添加的所有控件,以便我可以在 AsyncPostBack 上重新添加它们。每次我尝试这样做时,都会收到一条错误消息,指出“集合已修改;枚举操作可能无法执行”。然而,下面是我用来尝试删除 LiteralControls 的代码;一旦我弄清楚问题,我将不得不删除其他类型。有人有吗

                    foreach(Control xxl in UpdatePanel1.ContentTemplateContainer.Controls.OfType<Control>())
                {
                    Label2.Text = Label2.Text + xxl.GetType();

                    foreach (LiteralControl lc in UpdatePanel1.ContentTemplateContainer.Controls.OfType<LiteralControl>())
                    {
                    LiteralControl myLit = (LiteralControl)lc;
                    UpdatePanel1.ContentTemplateContainer.Controls.Remove(myLit);
                    UpdatePanel1.Update();
                    }
                }

【问题讨论】:

  • 不要做foreach,做for,有索引,倒数
  • 如果您在枚举循环时删除项目,您将收到异常。

标签: c# asp.net asynchronous


【解决方案1】:

您不能使用foreach 循环修改项目,无论是否动态控制。

如果你想修改项目,你必须使用普通的for循环。

一些普遍的建议是使用动态控件是困难的,通常建议不惜一切代价避免它,并使用不同的asp:Panels 通过切换Visibility 来更改内容。尤其是UpdatePanels,因为它们往往是一些最挑剔的控件,并且您可以在其中放置的内容是有限的。我确实理解“一般”建议可能很难适用于您的特定项目,请尽力而为。

【讨论】:

  • 如何在 for 循环中遍历更新面板中的控件?不幸的是,这必须使用 AsyncPostBack 这就是我使用 UpdatePanel 控件的原因:(
  • 我假设是这样的。 var myControl = (Control)UpdatePanel1.ContentTemplateContainer.Controls[i];
  • @ChrisLombardi 是的,就像那样:)
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2013-03-14
  • 2013-12-26
相关资源
最近更新 更多