доступ к базе данных не обновляется в DataGridView после удаления строки

1

Я разрабатываю хранилище приложений для компьютеров, и мне нужна опция для удаления продукта из хранилища, поэтому я создал 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();
        }


    }
}
Теги:
database
oledb
nullreferenceexception

2 ответа

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

Вы можете написать этот код перед написанием кода для удаления строк (строк) базы данных. Надеюсь, это поможет и вам. Отправьте мне ответ, когда вы (или кто-либо еще) попробуете этот код, чтобы узнать, работает ли он или нет.

0

Я думаю, проблема заключается в том, что вы удаляете элементы по мере их перемещения. что может помочь создать список идентификаторов для удаления. затем в конце удалите их все и перепроверьте сетку.

что-то вроде этого:

            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)

надеюсь это поможет

  • 0
    как мне привязать мою сетку?
  • 0
    как вы получили данные там в первую очередь? Вы также можете сохранить список индексов для удаления, не самый чистый, но пока будете работать
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню