为DatagridViewCell分配值时的ArgumentOutOfRangeException

时间:2018-01-08 13:03:44

标签: c# loops datagridview cell

我有一个计时器,我试图在下一行时选择下一行。这是我的代码:

DataGridViewCell cell;

for (int i = lastRowIndex + 1; i < links_dgv.Rows.Count - 1; i++)
{
    if (links_dgv.Rows[i].Cells[0] != null)
    {
        lastRowIndex = i;
        break;
    }
    Console.WriteLine(lastRowIndex.ToString());
}

cell = links_dgv.Rows[lastRowIndex].Cells[0];

最后一行是给我ArgumentOutOfRangeException。我该如何解决这个问题?

编辑:此处输出错误消息:

  

未处理的类型&#39; System.ArgumentOutOfRangeException&#39;   发生在mscorlib.dll

     

其他信息:指数超出范围。必须是非负面的   并且小于集合的大小。

2 个答案:

答案 0 :(得分:0)

由于低代表我无法添加评论,但是在开始时lastRowIndex的值是多少?到最后?

编辑:根据您的回答:

你的i从值1开始 如果links_dgv中的行少于3行,那么您将无法进入for循环。 - &GT;你的links_dgv.rows [0] .cells [0]会触发异常吗?

如果您在links_dgv中至少有3行,则输入您的for并检查您的第二行是否为空。这是你想要做的吗? 我可能错了,但我认为你应该写int i = lastRowIndex,而不是int i = lastRowIndex + 1

EDIT2:

    DataGridViewCell cell = null;

    if (links_dgv.Rows.Count >0)
        for (int i = lastRowIndex; i < links_dgv.Rows.Count; i++)
        {
            if (links_dgv.Rows[i].Cells[0] != null)
            {
                lastRowIndex = i;
                cell = links_dgv.Rows[lastRowIndex].Cells[0];
                break;
            }
    }   

我注意到了break指令,你只想要在lastRowIndex之后的行吗? 这可能更好

if (links_dgv.Rows.Count >= lastRowIndex +1)
{
    cell = links_dgv.Rows[lastIndex + 1].Rows[0];
    lastRowIndex++;
}

答案 1 :(得分:0)

好的,我明白了。问题是我使用的是另一个来自datagridview而不是main表单,并且表单是由主表单打开的。我知道这是一个肮脏的修复,但如果我在创建表单变量后显示表单,问题似乎已得到修复:

private void pageDelayTmr_Tick(object sender, EventArgs e)
{
    FormEditLinks formEditLinks = new FormEditLinks();
    formEditLinks.Show();
    List<string> list = formEditLinks.GetData();
    if (list != null)
    {
        webBrowser1.Navigate(list[2]);
    }
    formEditLinks.Dispose();
}