【问题标题】:Datagridview Error:: Index was out of range. How I can Solve it?Datagridview 错误:: 索引超出范围。我该如何解决?
【发布时间】:2013-09-16 06:29:11
【问题描述】:

我有这个表单应用程序项目。我上传了销售领域的快照。有两个datagridview。底部datagirdview 包含TAX details。包含底部datagrid 来自database except “Amount” column。用户提供或自动计算的金额列值。我写一个代码。当我尝试执行时,它显示错误。 Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index。怎么解决??

捕捉::

代码如下:

        private void dgvSalesFooterAdd_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
        {
            decimal Total = 0;

            decimal a=Convert.ToDecimal(lblTotalAdd.Text);
            for (int i = 0; i <dgvSalesFooterAdd.Rows.Count ; i++)
            {

                dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

                Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
            }
            lblFinalTotalAdd.Text = Total.ToString();
        }

[注意:错误

dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));
Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value); 

这两条线。]

【问题讨论】:

  • 看起来它不能抛出异常,除非你犯了一些错字,其中j被用作index而不是i。顺便说一句,j 是为了什么
  • @KingKing:我使用 j 只是为了测试。省略它。好的,我会更新它
  • 很难看出哪里出了问题。当你调试这个时你看到了什么?有多少行/单元格?
  • @Halvard:: 项目运行良好,期待此页面。在这个 datagridview 中有 5 列。行大小不固定。

标签: c# winforms ms-access datagridview oledb


【解决方案1】:
  dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a *(Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));
Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value); 

它会抛出异常,因为您正在读取第 4 列的值为 null,因为一旦您离开单元格,cell_value 更改就会起作用...

通过这个链接它会给你一个更好的图片.. http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvaluechanged.aspx

试试你这样的代码..

 void dgvSalesFooterAdd_CurrentCellDirtyStateChanged(object sender,
EventArgs e)
 {
if (dgvSalesFooterAdd.IsCurrentCellDirty)
{
    dgvSalesFooterAdd.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}

  private void dgvSalesFooterAdd_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
    {
        decimal Total = 0;

        decimal a=Convert.ToDecimal(lblTotalAdd.Text);
        for (int i = 0; i <dgvSalesFooterAdd.Rows.Count ; i++)
        {

            dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

            Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
        }
        lblFinalTotalAdd.Text = Total.ToString();
    }

【讨论】:

  • 如果是这样,它应该是NullReferenceException 而不是IndexOutOfRangeException
  • 我没有检查异常,但一旦用户控制离开该单元格,cell_value 更改将提交值.. 并且根据 Animesh Ghosh 提供的代码正在尝试读取未提交的值..因此它会抛出异常
【解决方案2】:

i 中找不到Row 索引时抛出异常。您必须将行数减少 1。这将告诉循环仅计算由值填充的行。换行

int i = 0; i <dgvSalesFooterAdd.Rows.Count

int i = 0; i <dgvSalesFooterAdd.Rows.Count - 1

完整的块将如下所示;

        for (int i = 0; i <dgvSalesFooterAdd.Rows.Count - 1; i++)
        {

            dgvSalesFooterAdd.Rows[i].Cells[4].Value = a + (a * (Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[3].Value)/100));

            Total += Convert.ToDecimal(dgvSalesFooterAdd.Rows[i].Cells[4].Value);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-06-20
    • 2017-08-16
    • 1970-01-01
    • 2022-11-30
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多