C#从DataGridView中删除行并更新数据库
我正在尝试创建一个包含DataGridView的应用程序,其中数据绑定到数据源。我在Form_Load上使用fill方法,我想知道如何删除一个或多个复选框行,不仅从表中,而且同时从数据库/数据源中删除 我在“删除”按钮上使用此代码,但它不会永久删除所选行。有什么帮助吗C#从DataGridView中删除行并更新数据库,c#,database,datagridview,rows,C#,Database,Datagridview,Rows,我正在尝试创建一个包含DataGridView的应用程序,其中数据绑定到数据源。我在Form_Load上使用fill方法,我想知道如何删除一个或多个复选框行,不仅从表中,而且同时从数据库/数据源中删除 我在“删除”按钮上使用此代码,但它不会永久删除所选行。有什么帮助吗 for (int i = 0; i < Products.Rows.Count; i++) { DataGridViewRow dr = Products.Rows[i]; if (dr.Selected =
for (int i = 0; i < Products.Rows.Count; i++)
{
DataGridViewRow dr = Products.Rows[i];
if (dr.Selected == true)
{
Products.Rows.RemoveAt(i);
}
}
for(int i=0;i
您必须编写必要的呼叫给DB经理。如果您使用的是MYSQL,那么您可以使用:
for (int i = 0; i < Products.Rows.Count; i++)
{
DataGridViewRow dr = Products.Rows[i];
if (dr.Selected == true)
{
Products.Rows.RemoveAt(i);
// CODE ADDED
MySqlCommand cmd = sql.CreateCommand(); // creates the MySQL object needed for queries (I think there's another way also, but I use this)
cmd.CommandText = "DELETE FROM table WHERE id = 1"; // sets the query
try
{
cmd.ExecuteNonQuery(); // executes the query
}
catch( MySqlException e )
{
sql.Close();
Console.WriteLine( e.Message );
}
sql.Close();
// CODE ADDED
}
}
您所做的是仅从
DataGridView
中删除所选行
您没有进行任何数据库调用来删除行
我假设您使用的是Microsoft SQL server
在这种情况下,您需要获得唯一标识产品的东西。例如,产品Id
假设您已将数据库中的ProductId
列绑定到DataGridView
中的某个列
您的代码应该如下所示
//string variable to capture product Ids for selected products
System.Text.StringBuilder productIds = new System.Text.StringBuilder(string.empty);
for (int i = 0; i < Products.Rows.Count; i++)
{
DataGridViewRow dr = Products.Rows[i];
if (dr.Selected == true)
{
Products.Rows.RemoveAt(i);
productIds.Append(productIds.length > 0 ? "," + Convert.ToString(dr["ProductId"]) : Convert.ToString(dr["ProductId"]));
}
}
DeleteProducts(productIds.ToString());
您的存储过程应该如下所示(假设是MS SQL Server)
您需要进行数据库调用以删除所选行。该数据库已存在,并在应用程序运行时加载。问题是,当通过“删除”按钮删除1个或多个复选框行时,这些行将消失,但如果我重新启动程序,这些行将再次出现。你知道如何更新数据库中的更改吗?你能指定你正在使用的数据库吗。MS SQL Server、MySQL或Oracle等。?
if (MessageBox.Show("Confirm ?","DELETE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
string name = dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString();
sql = "DELETE FROM [TABLE] WHERE [id] = " + dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString();
if (db.Exec(sql) > 0)
{
MessageBox.Show(name + " deleted");
dtSummary.Rows.Find(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString()).Delete();
dataGridView1.Refresh();
}
else
{
MessageBox.Show("error while deleting")
}
}
//string variable to capture product Ids for selected products
System.Text.StringBuilder productIds = new System.Text.StringBuilder(string.empty);
for (int i = 0; i < Products.Rows.Count; i++)
{
DataGridViewRow dr = Products.Rows[i];
if (dr.Selected == true)
{
Products.Rows.RemoveAt(i);
productIds.Append(productIds.length > 0 ? "," + Convert.ToString(dr["ProductId"]) : Convert.ToString(dr["ProductId"]));
}
}
DeleteProducts(productIds.ToString());
private int DeleteProducts(string productIds)
{
int recordsDeleted = 0;
using (SqlConnection conn = new SqlConnection("Your connection string here"))
{
try
{
using (SqlCommand cmd = new SqlCommand("Your SQL Stored Procedure name here", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter paramProductIds = new SqlParameter("@productIds", varchar(2000));
paramProductIds.Value = productIds;
cmd.Parameters.Add(paramProductIds);
conn.Open();
recordsDeleted = cmd.ExecuteNonQuery();
}
}
finally { conn.Close(); }
}
return recordsDeleted;
}
CREATE PROCEDURE DeleteProducts
@productIds VARCHAR(2000)
AS
BEGIN
DELETE FROM Products WHERE ProductId IN (SELECT item FROM dbo.Split(',', @productIds))
END