2016-04-11 22 views
1

を与える行の私に与えて削除]コマンドがエラー

DataGridViewのインデックスが範囲外でした。負でなく、コレクションのサイズより小さい でなければなりません。パラメータ名:インデックス例外

と私は最後の列名が残っています。フッタには私に合計値が表示されますが、問題は私に最後のバランス値を示していないことです。

バランスが-2000,3000,4000の3つの値を入力しているので、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

SelectedRowsRowsは、2つの異なるコレクションです。
持つ行> 1 doensn't平均SelectedRows> 0私はあなたの意図はグリッドから行を削除することであるが、選択された行は、あなたが保つグリッドの最後の1(でない場合は、あなたのコードを理解していれば

要約)

if (dataGridView1.Rows.Count > 1 && 
    dataGridView1.SelectedRows.Count > 0 && 
    dataGridView1.SelectedRows[0].Index != dataGridView1.Rows.Count - 1) 

があなたの合計を修正するには、単にあなたの実際のコードは、インデクサがRows.Countよりも低くなるまでループし

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

Noticeをあなたのループを変更する必要があります - 2が、これは間違っています除外しているからその最後の良い行は、行のフッターです.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(); 
} 
+0

オブジェクト参照がオブジェクトのインスタンスに設定されていません。 cmd.CommandText = "元帳からAccountNumber =" + dataGridView1.SelectedRows [0] .Cells [0] .Value.ToString()+ "";を削除します。 – Atul

+0

これは、SelectedRow [0]のセル[0]がヌルであることを意味します。しかし、あなたのイメージからは明らかではありません。最初のセルはAccountNumberのようです。セルのインデックス0に非表示の列がないことは確かですか? – Steve

+0

はいsteve隠された列がありません – Atul

関連する問題