2013-03-15 70 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