2016-11-10 109 views
0

我想了解为什么这段代码不起作用。WPF foreach文本框循环

有人可以帮忙吗?

 foreach (TextBox replyBox in textboxPanel.Children.OfType<TextBox>()) 
     { 
      if (replyBox.Name.Contains("Reply")) 
      { 
       textboxPanel.Children.Remove(replyBox); 
      } 
     } 

它返回一条消息,说明类型已更改。

我已经看到一些其他职位使用panel.controls,但我不知道我的面板。

问候,

+1

什么是确切的错误信息?另外,请张贴一些XAML与面板和文本框。 –

回答

1

您正在尝试从迭代集合中删除的项目,而不是,你可以尝试收集您减弱删除所有文本框,然后遍历它们,并通过一个从删除一个在textboxPanel我描述如下:

尝试这样:

var textBoxesToRemove = textboxPanel.Children.OfType<TextBox>().Where(x => x.Name.Contains("Reply")); 
foreach (TextBox txtToRemove in textBoxesToRemove) 
{ 
    textboxPanel.Children.Remove(txtToRemove); 
} 
+0

谢谢。几乎所有的答案都很好,但我喜欢LINQ的加入。 –

0

从已用于迭代的相同集合中删除可能会产生问题。你可以这样做:

var childerns = textboxPanel.Children.OfType<TextBox>(); 
foreach (TextBox replyBox in childerns) 
     { 
      if (replyBox.Name.Contains("Reply")) 
      { 
       textboxPanel.Children.Remove(replyBox); 
      } 
     } 
3

基本foreach循环是不可改变的。

https://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx

foreach语句被用于通过收集迭代,以获得您想要的信息,但不能用于添加或从源集合中删除的项目,以避免不可预知的副作用。如果您需要添加或删除源集合中的项目,请使用for循环。

我会解决你的问题是这样的:

rootPanel.Children.OfType<TextBox>().ToList() 
      .ForEach(item => 
      { 
       if (item.Text.Contains("Reply")) 
       { 
        rootPanel.Children.Remove(item); 
       } 
      }); 

你也可以使用LINQ:

rootPanel.Children.OfType<TextBox>() 
      .Where(textbox => textbox.Text.Contains("Reply")) 
      .ToList().ForEach(item => rootPanel.Children.Remove(item)); 

这部作品的原因是因为你通过ToList()创建的列表进行迭代。