1

私の現在のコード:

Remove()
{
    for (int i = 0; i < ConGridView.RowCount; i++)
    {
        if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address)
        {
            ConGridView.Rows.RemoveAt(i);
            break;
        }
    }
}

したがって、クライアントが切断するたびに削除関数を呼び出そうとしています。この関数は、データグリッドビューから接続アドレスを削除します。クライアントが1つずつ切断されている場合にうまく機能します。ただし、100個の接続がドロップされ、1秒以内に100個の接続を削除しようとすると、「提供された行インデックスが範囲外です」というエラーが表示されます。どうすれば確認できますか?

これまで私が試した:試して、キャッチ。if(ConGridView.Rows [i]!= null)、if(i <ConGridView.RowCount)これまでのところどれも機能していないようです。(i <ConGridView.RowCount)を使用した結果も得られました。ここで、iは26、RowCountは24ですが、removeat関数は引き続きアクティブになります。

これについて何か考えはありますか?

4

6 に答える 6

3

あなたはこれを行うことはできません。コードはConGridViewのすべての行をループしますが、削除します。したがって、ある時点で、削除したアイテムにアクセスしようとします。これにより、説明したエラーが発生します。

おそらく、逆の順序で行を反復処理するための最良のアプローチです。このように、最後の行を削除しても、最初の行にアクセスするときに影響はありません。

于 2012-12-01T04:09:41.657 に答える
1

問題は、現在の行数でforループを初期化してから、同じ行をdatagridviewから削除し始めることです。ある時点で、forループは、残っている行数よりも大きいインデックスの行を削除しようとします。

代わりにこれを試してください:

for (int i = ConGridView.RowCount - 1; i >= 0; i--)
{
    if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address)
    {
        ConGridView.Rows.RemoveAt(i);
         break;
    }
}
于 2012-12-01T04:06:28.067 に答える
1

合計カウントを別の変数に取得してから反復しないのはなぜですか

Remove()
{
    int totalConnections  = ConGridView.RowCount;

    for (int i = 0; i < totalConnections ; i++)
    {
        if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address)
        {
            ConGridView.Rows.RemoveAt(i);
            break;
        }
    }
}
于 2012-12-01T04:11:59.387 に答える
1

この問題は、繰り返し処理しているコレクションを変更しているためです。一時配列と2つのループを使用して、エントリを削除するとよいでしょう。

Remove()

// You can use an array/list or whatever you want below.
Collection<DataGridViewRow> rowsToDelete = new Collection<DataGridViewRow>();

        for (int i = 0; i < ConGridView.RowCount; i++)
        {
             if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address)
                {
                        rowsToDelete.Add(ConGridView.Rows[i]);
                        break;
                }
        }

       // now remove the marked entries.
       foreach(DataGridViewRow deletedRow in rowsToDelete)
       {
           ConGridView.Rows.Remove(deletedRow);
       }
于 2012-12-01T04:31:40.310 に答える
1

配列からアイテムを削除すると、そのアイテムは再構築されます。残りの要素を1つ上にシフトして、削除したインデックスのギャップを削除します。

1. guybrush threepwood
2. murray
3. elaine
4. Jimmy Gibbs Jr.

ここで2.アイテムを削除した場合。これになります:

1. guybrush threepwood
2. elaine
3. Jimmy Gibbs Jr.

反復しているとき、想像してみてください。

for (int i = 0; i < myArray.Count; i++)
{
    if (i == 2) myArray.RemoveAt(i);
}

これを実行しているときに、i = 3の場合、3の要素が変更され、「elaine」であると予想されますが、「JimmyGibbsJr。」です。これを修正する1つの方法はi、削除すると1つ減り、i正しい値を参照していることを確認することです。

for (int i = 0; i < myArray.Count; i++)
{
    if (i == 2)
    {
         myArray.RemoveAt(i);
         i--;
    }
}

この場合はLINQを使用しますが、これを使用するとすべてが簡単になります。

myArray.RemoveAll(x => x == "murray");
于 2012-12-01T04:36:37.433 に答える
0

ここにいる全員から投稿されたすべての提案を試しましたが、エラーはまだありました。

別の方法で問題を解決しました...最終的に使用する予定だったので、TreeNodeViewに切り替えました。これで、必要な数の接続を削除できます。

For each(TreeNode TN in ConTreeView) 
{ 
   ConTreeView.Nodes.Remove(TN); 
}
于 2012-12-02T03:37:03.157 に答える