2014-01-10 93 views
0
private void btnDelete_Click(object sender, EventArgs e) 
{ 

int i; 
i = dataGridView1.SelectedCells[0].RowIndex; 

OleDbConnection con = new OleDbConnection(constr); 
OleDbCommand delcmd = new OleDbCommand(); 
if (dataGridView1.Rows.Count > 1 && i != dataGridView1.Rows.Count - 1) 
{ 
     delcmd.CommandText = "DELETE FROM tb1 WHERE ID=" + dataGridView1.SelectedRows[i].Cells[0].Value.ToString() + ""; 
     con.Open(); 
     delcmd.Connection = con; 
     delcmd.ExecuteNonQuery(); 
     con.Close(); 
     dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index); 
     MessageBox.Show("Row Deleted"); 
} 

} 

這是我從DataGridView和數據庫刪除入圍行,但是當我點擊刪除按鈕,其顯示的錯誤代碼......如何在C#中刪除選定的行從DataGridView和數據庫

「索引超出範圍必須大於集合的大小 非負少參數名:。指數」

plz幫助我的代碼...

+1

拋出的錯誤在哪裏?它在'i = dataGridView1.SelectedCells [0]'? –

+0

此命令引發此錯誤... delcmd.CommandText =「DELETE FROM tb1 WHERE ID =」+ dataGridView1.SelectedRows [i] .Cells [0] .Value.ToString()+「」; – user3138522

+0

你確定嗎?因爲你剛纔評論說它是'i = dataGridView1.SelectedCells [0]'行。 –

回答

0

嘗試在這樣按照以下步驟
1.從數據庫
2.您的DataGridView從數據庫
3.選擇數據的清除數據源刪除您行,並將其設置爲DataGridView的

0

「指數超出範圍。必須是非負值,並且小於集合的大小 。參數名稱:索引」

這意味着你正在訪問一個位置或指數,這是不存在的集合 當你點擊刪除按鈕,驗證任何單元格是否被選中

if(dataGridView1.SelectedCells.Count > 0) 
{ 
    i = dataGridView1.SelectedCells[0] 
    OleDbConnection con = new OleDbConnection(constr); 
    OleDbCommand delcmd = new OleDbCommand(); 
    if (dataGridView1.Rows.Count > 1 && i != dataGridView1.Rows.Count - 1) 
    { 
     delcmd.CommandText = "DELETE FROM tb1 WHERE ID=" + dataGridView1.SelectedRows[i].Cells[0].Value.ToString() + ""; 
     con.Open(); 
     delcmd.Connection = con; 
     delcmd.ExecuteNonQuery(); 
     con.Close(); 
     dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index); 
     MessageBox.Show("Row Deleted"); 
    } 
} 
else 
{ 
    MessageBox.Show("Please select a row"); 
} 
+0

我顯示datagridview中的數據像這樣... OleDbDataAdapter da = new OleDbDataAdapter(「select * from tb1」,con); DataTable dt = new DataTable(); da.Fill(dt); dataGridView1.DataSource = dt; 這是正確的方法嗎? – user3138522

+0

我用你的代碼..它是說我不存在於當前的情況下 – user3138522

+0

你可以提供更清晰的圖片「顯示當前上下文中不存在」的消息嗎? –

1

。探索DataGridView手動填充,然後訪問數據(我的意思是從單元格中獲取值),以及忽略一次性使用的using,以及使用字符串連接而不是參數化查詢,是直接下地獄的方式。我強烈建議您使用數據綁定和參數化查詢。
聲明實體類型,其實例將顯示在DGV

public class MyEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

配置DGV列是數據綁定(用於樣品,設置DataPropertyName屬性爲「ID」和「名」分別),並設置DGV數據來源:

 // your application fills this collection using data from database 
     var source = new List<MyEntity> 
     { 
      new MyEntity { Id = 1, Name = "Apple" }, 
      new MyEntity { Id = 2, Name = "Orange" }, 
      new MyEntity { Id = 3, Name = "Plum" }, 
      new MyEntity { Id = 4, Name = "Peach" }, 
     }; 

     dataGridView1.DataSource = new BindingList<MyEntity>(source); 

當你想從DGV刪除的項目,利用底層數據源,而不是從視圖中拾取的數據:

private void DeleteSelectedItem() 
    { 
     if (dataGridView1.SelectedRows.Count == 0) 
     { 
      return; 
     } 

     var itemToDelete = (MyEntity)dataGridView1.SelectedRows[0].DataBoundItem; 

     using (var connection = new OleDbConnection("...")) 
     { 
      connection.Open(); 

      using (var command = new OleDbCommand("DELETE FROM tb1 WHERE ID = ?", connection)) 
      { 
       // delete item from database 
       command.Parameters.AddWithValue("@Id", itemToDelete.Id); 
       command.ExecuteNonQuery(); 

       // delete item from datasource and update DGV 
       var dataSource = (BindingList<MyEntity>)dataGridView1.DataSource; 
       dataSource.Remove(itemToDelete); 
      } 
     } 
    } 
+0

ok lemme試試這個.. – user3138522

+1

注意,如果你使用'DataTable'作爲數據源(我讀過你的評論),那麼'DataBoundItem'就是'DataRow',並且解決方案更簡單你不需要任何實體類型)。只需從DataRow實例中獲取id值即可。如果你使用'DataAdapter',那麼你甚至不需要'DataBoundItem'。只需從數據表中刪除行,然後調用'DataAdapter.Update(DataTable)'。 – Dennis

相關問題