3

さて、まだ開いていない場合は、新しいフォームを開きたいと思います。そのため、フォームのタイトルまたはテキストに基づいてフォームをチェックします。これまでのところ、フォームが開き、既に開いている場合は前面に移動するだけで機能します。しかし、私の問題は、開いていない場合に新しいインスタンスを作成しようとすると、「コレクションが変更されました。列挙操作が実行されない可能性があります」というメッセージが表示されることです。そして、私は一生、理由を理解できません。どんな助けでも大歓迎です。

foreach (DataRow iRow in chatcheck.Rows)
{
   FormCollection fc = Application.OpenForms;
   foreach (Form f in fc)
   {
      if (f.Text != ChatReader["Sender"].ToString())
      {

         ChatBox chat = new ChatBox();
         Connection.ConnectionStrings.chatopen = ChatReader["Sender"].ToString();
         chat.Text = Connection.ConnectionStrings.chatopen;
         chat.Show();
         chat.BringToFront();

      }
      else if (f.Text == ChatReader["Sender"].ToString())
      {
              f.BringToFront();
      }
   }
}
4

4 に答える 4

7

a を使用しないでforeachfor-loopを使用します。

for (int i = 0; i < Application.OpenForms.Count; i++ )
{
    Form f = Application.OpenForms[i];
    if (f.Text != ChatReader["Sender"].ToString())
    {

        //...
        chat.Show();
        chat.BringToFront();
    }
    // ...
}

列挙中にの基になるコレクションを変更することはできませんforeach。しかし、新しいフォームを作成してそこに表示すると、それが起こります。オープン コレクションに別のフォームを追加します。

于 2013-09-29T21:41:15.583 に答える
0

foraeachaをループして変更するときにa を使用しないのはなぜDictionaryですか?? foreach以下のように、キーを使用して辞書をループできます。

            //get key collection from dictionary into a list to loop through    
            List<int> keys = new List<int>(Dictionary.Keys);

            // iterating key collection using simple for-each loop
            foreach (int key in keys)
            { 
                // Now we can perform any modification with values of dictionary.    
                Dictionary[key] = Dictionary[key] - 1; 

            }

ここにそれに関する投稿があります:C#でキーを使用して辞書を反復する方法

于 2014-11-11T12:05:04.650 に答える