无论我在哪里尝试删除我的datagridview行,它都会给我
datagridview索引超出范围。必须是非负的和更少的 比收集的大小。参数名称:索引异常
我最后一列名称是余额。它在页脚显示总值,但问题是它没有显示我的最后余额值。
假设我输入三个值余额-2000,3000,4000,所以它显示我只有2000 + 3000总和它没有显示最后一行总和。
我也粘贴了那段代码
删除代码:
private void btndelete_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count > 0)
{
**if (dataGridView1.Rows.Count > 1 && dataGridView1.SelectedRows[0].Index != dataGridView1.Rows.Count - 1 )**//Exception coming this line
{
cmd.CommandText = "Delete from Ledger where AccountNumber=" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString() + "";
con.Open();
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
MessageBox.Show("Row Deleted");
Load_data();
}
else
{
MessageBox.Show("Please select a row");
}
}
}
总和代码:
private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
{
double Total = 0;
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
Total += Convert.ToDouble(dataGridView1.Rows[i].Cells["Balance"].Value);
}
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells["Balance"].Value = Total;
lblsum.Text =Convert.ToString(Total);
}
答案 0 :(得分:1)
SelectedRows和Rows是两个不同的集合 有行&gt; 1 doensn意味着SelectedRows&gt; 0
如果我理解您的代码,您的意图是从网格中删除一行,但如果所选行是网格中的最后一行(您保留摘要的位置),则不会删除;
if (dataGridView1.Rows.Count > 1 &&
dataGridView1.SelectedRows.Count > 0 &&
dataGridView1.SelectedRows[0].Index != dataGridView1.Rows.Count - 1 )
要修复总和,您只需将循环更改为
即可for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
请注意,您的实际代码会循环,直到索引器比Rows.Count更低 - 但这是错误的,因为它排除了最后一个好行是Rows.Count中的页脚 - 1
这一部分,我强烈建议您不要使用OleDbCommand和OleDbConnection的全局对象。最好在需要它们的地方创建它们,并在使用后立即销毁它们。这样可以避免保留宝贵的资源,避免使用未初始化的对象或以前的代码路径残留来实现细微的错误
string cmdText = "DELETE from Ledger Where AccountNumber = @num";
using(OleDbConnection con = new OleDbConnection(......))
using(OleDbCommand cmd = new OleDbCommand(cmdText, con))
{
con.Open();
cmd.Parameters.Add("@num", OleDbType.Integer).Value =
Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value);
cmd.ExecuteNonQuery();
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
MessageBox.Show("Row Deleted");
Load_data();
}