我正在开发一个应用程序计算机商店,我需要一个选项来删除商店中的产品,所以我创建了一个 DataGridView 和数据源它是访问的数据库文件。
当我第一次调试时,我删除了一行,并在Access数据库文件中更新了DataGridView和Updated,但是当我退出应用程序重新调试时,列表再次显示已删除的行(虽然它没有在访问数据库文件中显示。)
当我删除任何行
时,它也会导致错误(SystemNullReferenceException)
使用OleDb提供商。
这是我的代码:
namespace CompStore
{
public partial class ProductRemove : Form
{
private string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=J:\C#\CompStore\Store.accdb";
OleDbConnection con;
OleDbCommand com;
public ProductRemove()
{
con = new OleDbConnection(str);
InitializeComponent();
}
private void ProductRemove_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'storeDataSet.Products' table. You can move, or remove it, as needed.
this.productsTableAdapter.Fill(this.storeDataSet.Products);
}
private void button1_Click_1(object sender, EventArgs e)
{
con.Open();
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
DataGridViewRow delrow = dataGridView1.Rows[i];
if (delrow.Selected == true)
{
try
{
com.CommandText = "DELETE FROM Products WHERE ProductID=" + dataGridView1.Rows[i].Cells[0].Value + "";
com.Connection = con;
int count = com.ExecuteNonQuery();
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
dataGridView1.Rows.RemoveAt(i);
}
}
con.Close();
}
}
}
答案 0 :(得分:0)
我认为问题在于您在移动项目时移除了项目。 可能有用的是创建要删除的ID列表。然后在最后删除所有并重新绑定网格。
类似的东西:
var idsToRemove = new List<int>();
var rowsToRemove = new List<int>();
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
DataGridViewRow delrow = dataGridView1.Rows[i];
if (delrow.Selected == true)
{
try
{
//com.CommandText = "DELETE FROM Products WHERE ProductID=" + dataGridView1.Rows[i].Cells[0].Value + "";
//com.Connection = con;
//int count = com.ExecuteNonQuery();
idsToRemove.add(dataGridView1.Rows[i].Cells[0].Value);
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
//dataGridView1.Rows.RemoveAt(i);
//^this changes the list length throws things off
rowsToRemove.Add(i);
}
}
con.Open();
com.CommandText = "DELETE FROM Products WHERE ProductID in(" + string.join(',', idsToRemove.ToArray() + ")";
con.Close();
//now rebind your grid so it has the right data
// or for each row to remove dataGridView1.Rows.RemoveAt(arow)
希望这会有所帮助
答案 1 :(得分:0)
我认为此代码可能有助于解决您的DataGridView问题(我自己使用此代码):
private void button1_Click_1(object sender, EventArgs e)
{
foreach (DataGridViewRow item in this.datagridview1.SelectedRows)
{
datagridview1.Rows.RemoveAt(item.Index);
}
}
(编写完整的foreach代码片段比在其中编写语句更好,确保此代码片段在for循环之外!)
您可以在编写用于删除数据库行的代码之前编写此代码。 希望这对你也有帮助。当你(或其他任何人)尝试使用此代码判断它是否有效时,请给我回复。