1

我当前的代码:

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

所以每次客户端断开连接时我都试图调用删除函数。该函数将从 datagridview 中删除连接地址。当客户端一个一个断开连接时,它工作得很好。但是,如果 100 个连接被丢弃并且它试图在不到一秒的时间内删除 100 个连接,那么它就会出错,说“提供的行索引超出范围”。我应该如何检查?

到目前为止,我已经尝试过:尝试,抓住。if (ConGridView.Rows[i] != null), if (i < ConGridView.RowCount) 到目前为止似乎都不起作用。我还使用 (i < ConGridView.RowCount) 得到了结果,其中 i 为 26,而 RowCount 为 24,但 remove at 函数仍然激活..

对此有任何想法吗?

4

6 回答 6

3

你不能这样做。您的代码循环遍历 ConGridView 中的所有行,但它会像您一样删除它们。因此,有时您会尝试访问已删除的项目,这将导致您描述的错误。

可能是它以相反顺序遍历行的最佳方法。这样,在末尾删除一行不会影响您在开始时访问行的时间。

于 2012-12-01T04:09:41.657 回答
1

这个问题是因为您正在修改您正在迭代的集合。如果您使用临时数组和两个循环来删除您的条目会更好。

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

问题是你用当前的行数初始化你的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

当您从数组中删除一个项目时,它会被重建;将其余元素向上移动 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”,但它是“Jimmy Gibbs Jr.”。解决此问题的一种方法是i,如果我们将其删除,则将其减一,确保它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 回答