C# 提供的行索引超出范围,即使在检查之后也是如此

C# 提供的行索引超出范围,即使在检查之后也是如此,c#,winforms,visual-studio-2010,visual-studio,for-loop,C#,Winforms,Visual Studio 2010,Visual Studio,For Loop,我当前的代码: Remove() { for (int i = 0; i < ConGridView.RowCount; i++) { if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address) { ConGridView.Rows.RemoveAt(i); break; } } } Remove() {

我当前的代码:

Remove()
{
    for (int i = 0; i < ConGridView.RowCount; i++)
    {
        if (ConGridView.Rows[i].Cells[0].Value.ToString() == Address)
        {
            ConGridView.Rows.RemoveAt(i);
            break;
        }
    }
}
Remove()
{
对于(int i=0;i
因此,每次客户端断开连接时,我都试图调用remove函数。该函数将从datagridview中删除连接地址。当客户端一个接一个地断开连接时,它工作得很好。然而,如果100个连接被删除,并且它试图在不到一秒钟的时间内删除100个连接,那么它就会出错,说“提供的行索引超出范围”。我该怎么检查呢

到目前为止,我已经尝试: 试试看,接住。 if(CongredView.Rows[i]!=null),if(i
有什么想法吗

问题是您使用当前行数初始化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;
    }
}

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

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


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

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


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

为什么不将总计数保存到单独的变量中,然后进行迭代

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;
        }
    }
}
Remove()
{
int totalConnections=congreidview.RowCount;
对于(int i=0;i
为什么不将总计数放到一个单独的变量中,然后进行迭代

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;
        }
    }
}
Remove()
{
int totalConnections=congreidview.RowCount;
对于(int i=0;i
此问题是因为您正在修改要迭代的集合。如果使用临时数组和两个循环来删除条目,效果会更好

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);
       }
Remove()
//您可以使用数组/列表或下面需要的任何内容。
集合行stodelete=新集合();
对于(int i=0;i
此问题是因为您正在修改要迭代的集合。如果使用临时数组和两个循环来删除条目,效果会更好

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);
       }
Remove()
//您可以使用数组/列表或下面需要的任何内容。
集合行stodelete=新集合();
对于(int i=0;i
当您从数组中删除一个项时,它将被重建;将其余元素上移一,以消除已删除索引的间隙

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);
}
不过,在这种情况下,我会选择LINQ,因为这样做会让一切变得更容易

myArray.RemoveAll(x => x == "murray");

从数组中移除项时,将重建该项;将其余元素上移一,以消除已删除索引的间隙

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);
}
不过,在这种情况下,我会选择LINQ,因为这样做会让一切变得更容易

myArray.RemoveAll(x => x == "murray");

我尝试了这里所有人的建议,但是错误仍然存在


我用另一种方法解决了这个问题。。。我已经切换到TreeNodeView,因为这是我最终要使用的。现在,我可以使用以下工具删除任意数量的连接:

For each(TreeNode TN in ConTreeView) 
{ 
   ConTreeView.Nodes.Remove(TN); 
}

我尝试了这里所有人的建议,但是错误仍然存在


我用另一种方法解决了这个问题。。。我已经切换到TreeNodeView,因为这是我最终要使用的。现在,我可以使用以下工具删除任意数量的连接:

For each(TreeNode TN in ConTreeView) 
{ 
   ConTreeView.Nodes.Remove(TN); 
}

它不起作用。但是在你的建议下,我意识到了一些事情,并尝试了以下方法:for(inti=0;I