Я разрабатываю хранилище приложений для компьютеров, и мне нужна опция для удаления продукта из хранилища, поэтому я создал DataGridView, а источником данных был файл доступа к базе данных.
когда я отлаживался в первый раз, я удалил строку и обновил ее в DataGridView и обновил в файле базы данных Access, но когда я выхожу из приложения повторно отладки, список показывает удаленную строку еще раз (хотя это не так показывается в файле базы данных доступа).
и это также вызывает ошибку (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();
}
}
}
Я думаю, что этот код может работать для решения вашей проблемы с DataGridView (я сам использую этот код):
private void button1_Click_1(object sender, EventArgs e)
{
foreach (DataGridViewRow item in this.datagridview1.SelectedRows)
{
datagridview1.Rows.RemoveAt(item.Index);
}
}
(Написание этого полного фрагмента кода foreach будет лучше, чем просто записать внутри него оператор, убедитесь, что этот фрагмент кода находится вне цикла for!)
Вы можете написать этот код перед написанием кода для удаления строк (строк) базы данных. Надеюсь, это поможет и вам. Отправьте мне ответ, когда вы (или кто-либо еще) попробуете этот код, чтобы узнать, работает ли он или нет.
Я думаю, проблема заключается в том, что вы удаляете элементы по мере их перемещения. что может помочь создать список идентификаторов для удаления. затем в конце удалите их все и перепроверьте сетку.
что-то вроде этого:
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)
надеюсь это поможет