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