2015-12-18 111 views
3

這是一個簡單的問題,但由於我是C#的新手,我不確定如何解決此問題。 基本上,我有一個datagridview顯示來自MySQL表的記錄。我有一個刪除按鈕,通過點擊執行SQL查詢,這工作正常,並且也意味着從datgridview中刪除選定的行。但實際發生的是,即使只選擇了一行,它也會刪除多行。 下面是該查詢:試圖從datagridview中刪除選定的行,但它刪除了多行

private void delete_btn_Click(object sender, EventArgs e) 
    { 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      string constring = @"server = localhost; user id = root; password = pass; persistsecurityinfo = false; database = mapping; allowuservariables = false"; 
      using (MySqlConnection con = new MySqlConnection(constring)) 
      { 
       using (MySqlCommand cmd = new MySqlCommand("UPDATE deletion SET date_time = UTC_TIMESTAMP() where product_id =" + proid_txtbx.Text, con)) 
       { 
        cmd.Parameters.AddWithValue("@product_id", row.Cells["product_id"].Value); 
        cmd.Parameters.AddWithValue("@product_name", row.Cells["product_name"].Value); 
        cmd.Parameters.AddWithValue("@category_id", row.Cells["category_id"].Value); 
        cmd.Parameters.AddWithValue("@date_time", row.Cells["date_time"].Value); 
        con.Open(); 
        cmd.ExecuteNonQuery(); 
       } 
       foreach(DataGridViewRow item in this.dataGridView1.SelectedRows) 
       { 
        dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index); 
       } 
      } 
     } 

截圖: 第6行應該被刪除:當我點擊刪除按鈕 enter image description here

+1

您的命令不_even_有參數。當你運行它時,你可能會得到一個異常。 –

+0

cmd.Parameters.AddWithValue(「@ product_id」,row.Cells [「product_id」]。Value); –

回答

2

我覺得你的問題是與 enter image description here 其他行被刪除您的foreach循環。您在dataGridView1.Rows之間循環所有行。 TR dataGridView1.SelectedRows代替:

foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
    if (!row.IsNewRow) dataGridView1.Rows.Remove(row); 
+1

絕對正確。謝謝。 –

0

如何創建新的命令,somethnig像...

DELETE FROM YourTable WHERE product_id = ?

後,你可以得到選定項指標的值:

int product_id = Convert.ToInt32(DataGridView1.SelectedRows[0].Cells[0].Value) 

而且最後運行命令並將它從命令中獲得的product_id int傳遞給它。我想應該沒有問題工作...

0

您可以使用:

private void delete_btn_Click(object sender, EventArgs e) 
{ 
    //Works even when whole row is selected. 
    int rowIndex = datagridview.CurrentCell.RowIndex; 

    //You can also then easily get column names/values on that selected row 
    string product_id = datagridview.Rows[rowIndex].Cells["Column Name Here"].Value.ToString(); 

    //Do additional logic 

    //Remove from datagridview. 
    datagridview.Rows.RemoveAt(rowIndex); 

}