尝试从datagridview中删除选定行,但它会删除多行。

3

这是一个简单的问题,但由于我刚接触C#,不确定如何解决。 基本上,我有一个datagridview显示来自MySQL表的记录。我有一个删除按钮,点击后执行SQL查询,这个查询很好用,也意味着要从datgridview中删除所选行。但实际发生的是,即使只选择了一行,它也会删除多行。 这是查询:

    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 当我点击删除按钮时,其他行也会被删除 enter image description here

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Soner Gönül
cmd.Parameters.AddWithValue("@product_id", row.Cells["product_id"].Value); 命令.Parameters.AddWithValue("@product_id", row.Cells["product_id"].Value); - Chandni Vishen
3个回答

2

我认为你的问题出在foreach循环中。你正在使用dataGridView1.Rows遍历所有行,而应该使用dataGridView1.SelectedRows

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

1
绝对正确。谢谢。 - Chandni Vishen
它不起作用。尽管选择了一行,但是删除了两行。我现在正在面临这个问题。 - Syed Irfan Ahmad
观察到:当编写DataGridView的KeyDown事件(检测Keys.Delete)时,出现了故障(选择一个行时删除两个行)。但是,当相同的代码放在按钮的Clicked事件中时,它可以完美地工作。奇怪... - Syed Irfan Ahmad

0
怎么样创建一个新的命令,类似于... DELETE FROM YourTable WHERE product_id = ? 然后你可以获取所选项目索引的值:
int product_id = Convert.ToInt32(DataGridView1.SelectedRows[0].Cells[0].Value)

最后运行该命令,并将从命令中获取的product_id整数传递给它。我认为它应该没有问题...


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);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接