2016-11-10 2 views
0

Ich versuche zu verstehen, warum dieser Code nicht funktioniert.WPF foreach Textbox Schleife

Kann jemand helfen?

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

Es gibt eine Meldung, die Art verändert hat.

Ich habe einen anderen Beitrag mit panel.controls gesehen, aber ich habe das nicht für mein Panel irgendwie.

Grüßen,

+1

Was ist die genaue Fehlermeldung? Bitte posten Sie auch einige der XAML mit dem Panel und den Textboxen. –

Antwort

1

Sie versuchen, ein Element aus der Iterieren Sammlung zu entfernen, dass statt können Sie versuchen, alle Textfelder sammeln, die Sie entfernen nachgelassen, dann durch sie durchlaufen, und entfernen Sie eins nach dem anderen aus die textboxPanel, wie ich im folgenden beschrieben:

versuchen, etwas wie folgt aus:

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

Danke. Ziemlich viele Antworten waren gut, aber ich mochte die LINQ-Zugabe. –

0

aus derselben Sammlung entfernen, die für die Iteration verwendet wurden, könnten erstellt Problem. Sie können wie folgt tun:

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

die Grund foreach-Schleife ist unveränderlich.

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

Die foreach-Anweisung, um die Informationen zu erhalten, wird durch die Sammlung iterieren, die Sie wollen, kann aber nicht verwendet werden, um Elemente aus der Quelle Sammlung hinzuzufügen oder zu entfernen unvorhersehbare Nebenwirkungen zu vermeiden. Wenn Sie Elemente aus der Quellensammlung hinzufügen oder daraus entfernen möchten, verwenden Sie eine for-Schleife.

würde ich Ihr Problem auf diese Weise lösen:

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

Sie auch LINQ verwenden:

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

Der Grund dies funktioniert, ist, weil Sie durch die Liste von ToList() erstellt iterieren.