Обновление данных в списке из datatable

Я хочу показать данные из таблицы данных на form_load, используя список, и позже обновить эти данные из списка при нажатии кнопки командой Вставить. Функция для этого - fill_List(). Это мой код:

    OleDbConnection konekcija;
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    DataTable dt = new DataTable();

    public Form2()
    {
        InitializeComponent();
        string putanja = Environment.CurrentDirectory;
        string[] putanjaBaze = putanja.Split(new string[] { "bin" }, StringSplitOptions.None);
        AppDomain.CurrentDomain.SetData("DataDirectory", putanjaBaze[0]);
        konekcija = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=|DataDirectory|\B31Autoplac.accdb");
    }

    void fill_List()
    {
        konekcija.Open();
        OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija);
        adapter.SelectCommand = komPrikaz;
        adapter.Fill(dt);
        listBox1.Items.Clear();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            string pom;
            pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
            listBox1.Items.Add(pom);
        }
        konekcija.Close();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        fill_List();
    }

private void btnUpisi_Click(object sender, EventArgs e)
    {
        string s1, s2, s3;
        s1 = tbSifra.Text;
        s2 = tbNaziv.Text;
        s3 = tbOpis.Text;

        string Upisi = "INSERT INTO GORIVO (GorivoID, Naziv, Opis) VALUES (@GorivoID, @Naziv, @Opis)";
        OleDbCommand komUpisi = new OleDbCommand(Upisi, konekcija);
        komUpisi.Parameters.AddWithValue("@GorivoID", s1);
        komUpisi.Parameters.AddWithValue("@Naziv", s2);
        komUpisi.Parameters.AddWithValue("@Opis", s3);

        string Provera = "SELECT COUNT (*) FROM GORIVO WHERE GorivoID=@GorivoID";
        OleDbCommand komProvera = new OleDbCommand(Provera, konekcija);
        komProvera.Parameters.AddWithValue("@GorivoID", s1);

        try
        {
            konekcija.Open();
            int br = (int)komProvera.ExecuteScalar();
            if(br==0)
            {
                komUpisi.ExecuteNonQuery();
                MessageBox.Show("Podaci su uspesno upisani u tabelu i bazu.", "Obavestenje");
                tbSifra.Text = tbNaziv.Text = tbOpis.Text = "";
            }
            else
            {
                MessageBox.Show("U bazi postoji podatak sa ID = " + tbSifra.Text + ".", "Obavestenje");
            }
        }
        catch (Exception ex1)
        {
            MessageBox.Show("Greska prilikom upisa podataka. " + ex1.ToString(), "Obavestenje");
        }
        finally
        {
            konekcija.Close();
            fill_List();
        }
    }

Вместо этого Картинка с моим кодом

Это показывает мне это (добавлены дубликаты с новыми данными) Представь как должно быть

Есть ли проблема в моей функции или где-то еще?

2 ответа

Еще одна ошибка, вызванная глобальными переменными.
Вы храните глобальную переменную для DataTable, заполненную методом fill_list. Этот набор данных никогда не сбрасывается в пустой при вызове fill_list, поэтому при каждом вызове вы добавляете в набор данных еще один набор строк, а затем переносите эти данные в список. Используйте локальную переменную.

Но это же правило должно применяться и к OleDbConnection и OleDbCommand. Нет необходимости хранить их глобальные экземпляры. Создание объекта действительно быстро, и удобство, позволяющее избежать глобальных переменных, лучше, чем небольшая неприятность при создании экземпляра соединения или команды.

void fill_List()
{
    using(OleDbConnection konekcija = new OleDbConnection(......))
    using(OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija))
    {
          DataTable dt = new DataTable();
          konekcija.Open();
          OleDbDataAdapter adapter = new OleDbDataAdapter(komPrikaz);
          adapter.Fill(dt);
          listBox1.Items.Clear();
          for (int i = 0; i < dt.Rows.Count; i++)
          {
                string pom;
                pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
                listBox1.Items.Add(pom);
          }
     }
}

Clear ваш DataTable, прежде чем заполнять его снова.

void fill_List()
{
    konekcija.Open();
    OleDbCommand komPrikaz = new OleDbCommand("SELECT * FROM GORIVO ORDER BY GorivoID ASC", konekcija);
    adapter.SelectCommand = komPrikaz;
    dt.Clear(); // clear here
    adapter.Fill(dt);
    listBox1.Items.Clear();
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        string pom;
        pom = dt.Rows[i][0].ToString() + " " + dt.Rows[i][1].ToString() + " " + dt.Rows[i][2];
        listBox1.Items.Add(pom);
    }
    konekcija.Close();
}
Другие вопросы по тегам