【问题标题】:Argument Out of range exception Error参数超出范围异常错误
【发布时间】:2012-11-23 17:56:55
【问题描述】:

直到昨天,以下代码工作正常,但今天我收到一条错误消息 Argument out of exception & index out of range。

我要在这里做什么,从最后一行的index 3(4th col) 获取该单元格值并放入col 3 (index 2) cell。当我在最后一个单元格(从下到上)键入它时,我收到了上述错误消息。

请帮帮我。

private void datagridview_CellValidated(object sender, CellValidatedEventArgs e)
{

if (e.ColumnIndex != 3)
    return;
int nextRowIndex = e.RowIndex -1;
int lastRowIndex = datagridview.Rows.Count;
try
{

        if (nextRowIndex <= lastRowIndex)
        {
            var valuesForcell = datagridview.Rows[e.RowIndex].Cells[3].Value.ToString();
            datagridview.Rows[nextRowIndex].Cells[2].Value = valuesForcell;
            datagridview.Rows[nextRowIndex].Cells[2].ReadOnly = true;
            datagridview.Rows[nextRowIndex].Cells[2].Style.ForeColor = Color.MediumVioletRed;
            datagridview.ClearSelection();
            datagridview.SelectionMode = GridViewSelectionMode.CellSelect;
            datagridview.Rows[nextRowIndex].Cells[3].BeginEdit();

        }

}
catch (Exception exception) { }


}

【问题讨论】:

  • 代替nextRowIndex &lt;= lastRowIndex 试试nextRowIndex &lt; lastRowIndex
  • 设置索引为 0 的单元格值时会发生什么?在您的示例中,您在其中设置了 45
  • 我从 col 3 的最后一个单元格开始,然后 col 4 的最后一个单元格,然后向上直到 col 4 中最后一个单元格的末尾(从下到上)
  • @linguini check my answer
  • 您的表格中有标题吗? RowIndex 对应于第一个数据行(45 所在的位置)?

标签: c# winforms datagridview


【解决方案1】:

如果我理解得很好,你应该有:

private void datagridview_CellValidated(object sender, CellValidatedEventArgs e)
{

if (e.ColumnIndex != 3)
    return;
int nextRowIndex = e.RowIndex -1;
try
{

        if (nextRowIndex >=0 )
        {
            var valuesForcell = datagridview.Rows[e.RowIndex].Cells[3].Value.ToString();
            datagridview.Rows[nextRowIndex].Cells[2].Value = valuesForcell;
            datagridview.Rows[nextRowIndex].Cells[2].ReadOnly = true;
            datagridview.Rows[nextRowIndex].Cells[2].Style.ForeColor = Color.MediumVioletRed;
            datagridview.ClearSelection();
            datagridview.SelectionMode = GridViewSelectionMode.CellSelect;
            datagridview.Rows[nextRowIndex].Cells[3].BeginEdit();

        }

}
catch (Exception exception) { }


} 

你是在自下而上移动价值观吗?

【讨论】:

  • 你能评估变量 nextRowIndex 吗?
  • 这里有些混乱,你确定上面的代码都粘贴了吗?如果你这样做了,你能在抛出异常时评估变量“nextRowIndex”吗?
【解决方案2】:

如果e.RowIndex 返回您0 第一行,那么您的nextRowIndex 将设置为-1,这是错误的。

您的lastRowIndex 也应该比行数少一。

int lastRowIndex = datagridview.Rows.Count - 1;

我发现您没有引用lastRowIndex 上的行,您可以将支票修改为:

if (nextRowIndex < lastRowIndex)

【讨论】:

  • @linguini,你为什么将 nextRowIndex 设置为 e.RowIndex -1 ?如果 e.RowIndex 为 0 怎么办?表示第一行被选中?
  • 我想从最后一行开始。
【解决方案3】:

看起来您正在验证第 0 行中的单元格,因此 nextRowIndex 的计算结果为 -1,这显然不是有效的数组索引。

【讨论】:

  • 我认为如果您从下到上编辑单元格,您的条件应该类似于if(nextRowIndex &gt;= 0)。而且您根本不需要lastRowIndex,因为事件参数RowIndex 将始终在数组范围内。
【解决方案4】:

将您的 if 语句更改为如下内容:

 if ((nextRowIndex < lastRowIndex) && (nextRowIndex >= -1))

如果您想包含Rowheader-1 是有效的 rowIndex。

如果您不想包含RowHeader,请将-1 替换为0

希望这会有所帮助。

【讨论】:

  • 不,但这不是行为,当我输入第 4 列的 lat 单元格时,将该值放在相邻单元格的顶部单元格中
  • @linguini 尝试通过在某处给予或移除-1 来调整(我不知道在哪里给予或移除它)。首先了解你在做什么。让我也在这里试试。
  • 我找到了,int nextRowIndex = e.RowIndex-1;if (nextRowIndex &gt;= 0)
  • 这不是我 30 分钟前写的同一个解决方案吗? O_o
  • trippino 参考之前的linguini 的评论
【解决方案5】:

当您的e.RowIndex0nextRowIndex-1 并且您正在尝试访问

datagridview.Rows[-1].Cells[2].Value = valuesForcell;

抛出异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多