2013-03-15 76 views
0

我创建了一个winform应用程序,其中包含来自ms access数据库的listbox数据源。问题是当我点击更新按钮的列表框没有得到更新。例如,我将“ITEM1”更改为“ITEM2”,但它只是不工作,但数据库却这样做,因为我执行了一个将更新数据库的命令,我需要重新加载(重新打开)我的应用程序,那时我会看到我的修改我如何更新列表框?我读过一些关于这个问题之前,但我不明白它clearly..i希望有人可以帮助我..listbox datasource更新ms访问winform

private BindingList<PRODUCTLIST> _productlist; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public class PRODUCTLIST 
    { 
     public string ID { get; set; } 
     public string ITEM { get; set; } 
     public string ITEM_DESC { get; set; } 
    } 

    private static OleDbConnection GetConnection() 
    { 
     OleDbConnection mdbConn = new OleDbConnection(); 
     try 
     { 
      string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=shop.mdb;Jet OLEDB:Database Password=xxxxx;"; 
      mdbConn = new OleDbConnection(connectionString); 
      mdbConn.Open(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message); 
     } 
     return mdbConn; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // make ID textbox un editable 
     textBoxID.Enabled = false; 

     _productlist = new BindingList<PRODUCTLIST>(); 
     string strSQL = "SELECT * FROM Item ORDER BY ITEM"; 
     OleDbDataAdapter myCmd = new OleDbDataAdapter(strSQL, GetConnection()); 
     DataSet dtSet = new DataSet(); 
     myCmd.Fill(dtSet, "Item"); 
     DataTable dTable = dtSet.Tables[0]; 
     foreach (DataRow dtRow in dTable.Rows) 
     { 
      _productlist.Add(new PRODUCTLIST() { ID = dtRow["ID"].ToString(), ITEM = dtRow["ITEM"].ToString(), ITEM_DESC = dtRow["ITEM_DESC"].ToString() }); 
     } 
     listBox1.DisplayMember = "ITEM"; 
     listBox1.DataSource = _productlist; 
     //listBox1.DataBindings = _productlist; 
     listBox1.ValueMember = "ID"; 

     // set the textbox binding and DataSourceUpdateMode to Never because i have other button to add the new item 
     textBoxID.DataBindings.Add("Text", _productlist, "ID", false, DataSourceUpdateMode.Never); 
     textBoxITEM.DataBindings.Add("Text", _productlist, "ITEM", false, DataSourceUpdateMode.Never); 
     textBoxITEMDESC.DataBindings.Add("Text", _productlist, "ITEM_DESC", false, DataSourceUpdateMode.Never); 
    } 

    private void buttonUpdate_Click(object sender, EventArgs e) 
    { 
     // update data on database 
     OleDbCommand cmd = new OleDbCommand("UPDATE Item SET ITEM = @ITEM, ITEM_DESC = @ITEM_DESC WHERE ID = @ID", GetConnection()); 
     cmd.Parameters.AddWithValue("@ITEM", textBoxITEM.Text); 
     cmd.Parameters.AddWithValue("@ITEM_DESC", textBoxITEMDESC.Text); 
     cmd.Parameters.AddWithValue("@ID", Convert.ToInt32(textBoxID.Text)); 
     cmd.ExecuteNonQuery(); 

     // make the listbox datasource update 
     //listBox1.Refresh(); 
     //listBox1.DataSource = null; 
     //listBox1.DataSource = _productlist; 

     //_productlist = new BindingList<PRODUCTLIST>(); 
     //string strSQL = "SELECT * FROM Item ORDER BY ITEM"; 
     //OleDbDataAdapter myCmd = new OleDbDataAdapter(strSQL, GetConnection()); 
     //DataSet dtSet = new DataSet(); 
     //myCmd.Fill(dtSet, "Item"); 
     //DataTable dTable = dtSet.Tables[0]; 
     //foreach (DataRow dtRow in dTable.Rows) 
     //{ 
     // _productlist.Add(new PRODUCTLIST() { ID = dtRow["ID"].ToString(), ITEM = dtRow["ITEM"].ToString(), ITEM_DESC = dtRow["ITEM_DESC"].ToString() }); 
     //} 
     //listBox1.DisplayMember = "ITEM"; 
     //listBox1.DataSource = _productlist; 
     ////listBox1.DataBindings = _productlist; 
     //listBox1.ValueMember = "ID"; 

    } 

回答

0

的方式你正在做它,你需要清除并重新装载您的列表框中。

你应该提取代码从FormLoad事件处理程序的方法,并调用它在运行更新查询后。

很难说出你想走哪条路。根据你的要求。 你应该做的是让你的产品数据表成为一个私人财产。创建并打开它并绑定到列表框。

然后你的更新函数应该改变数据表。然后你会看到你的列表框中的变化。需要注意的是,直到您将对数据表进行的更改(ApplyChanges方法)刷新回数据库服务器,您所做的全部操作都是更改数据的本地副本。 这可能是好的和坏的。取决于您想让多个用户同时更新产品。

所以你已经有了一个本地副本的数据并显示它。 然后,您已经更新了您复制的表格,现在您的副本不合步骤。 完全相同的问题,如果你运行了另一个应用程序副本,并更改​​了第一个已经显示的记录之一。

+0

您的意思是我需要创建类似的东西吗? 私人空隙填充() { //连接到数据库和做选择查询.. } 私人无效Form1_Load的(对象发件人,EventArgs的) { 填充(); } private void buttonUpdate_Click(object sender,EventArgs e) //我的更新查询与问题 fill();相同。 } ??? – 2013-03-16 05:58:42

+0

您可以在查询后重新填充列表框,也可以删除查询并更新数据表。 – 2013-03-16 21:43:17