2016-11-10 2 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()によって作成されたリストを反復処理しているので、これは動作します理由です。