2017-06-01 88 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