删除命令给出错误

时间:2016-04-11 07:06:56

标签: c# datagridview ms-access-2007

无论我在哪里尝试删除我的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);


}

enter image description here

1 个答案:

答案 0 :(得分:1)

SelectedRowsRows是两个不同的集合 有行&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();
}