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 错误:: 索引超出范围。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章