2015-12-18 80 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); 

}