2017-06-01 86 views
-1

我想使用列表框在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 [email protected]"; 
     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(); 
     } 
    } 

取而代之的是 Picture with my code

這說明我這個(用新數據添加副本) Picture how it should be

有沒有在我的功能問題或別的地方?

回答

2

由全局變量引起的另一個bug。
您正在爲填充fill_list方法的DataTable保留一個全局變量。當您調用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); 
      } 
    } 
} 
+0

我現在就試試這個。感謝您的快速響應。 – Nikola

1

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(); 
} 
+0

謝謝@DrNachtschatten。這對我幫助很大。 – Nikola