Datagridview 错误:: 索引超出范围。我该如何解决?

Posted

技术标签:

【中文标题】Datagridview 错误:: 索引超出范围。我该如何解决?【英文标题】:Datagridview Error:: Index was out of range. How I can Solve it? 【发布时间】: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 列。行大小不固定。 【参考方案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);
        

【讨论】:

以上是关于Datagridview 错误:: 索引超出范围。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误:索引超出范围

准备转场时致命错误索引超出范围

我收到错误:致命错误:索引超出范围

UICollectionView 给出“索引超出范围”错误

Swift 致命错误:数组索引超出范围

Swift 致命错误:数组索引超出范围