0

ms access データベースから取得したリストボックス データソースを使用して winform アプリケーションを作成します。問題は、更新ボタンをクリックしてもリストボックスが更新されないことです。たとえば、「ITEM1」を「ITEM2」に変更しましたが、機能していませんが、データベースを更新するコマンドを実行したため、データベースが機能しました。アプリケーションをリロード(再度開く)する必要があり、その時点で変更が表示されます. リストボックスを更新するにはどうすればよいですか? 以前にこの問題について何か読んだことがありますが、はっきりとはわかりません..誰かが私を助けてくれたらいいのに..

    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";

    }
4

1 に答える 1

0

あなたがやっている方法では、リストボックスをクリアして再入力する必要があります。

そのコードを FormLoad イベント ハンドラーからメソッドとして抽出し、更新クエリを実行した後に呼び出す必要があります。

行きたい道を言うのは難しい。あなたが求めていることに基づいています。あなたがしなければならないことは、製品データテーブルを私有財産にすることです。作成して開き、リスト ボックスにバインドします。

次に、更新機能がデータテーブルを変更する必要があります。次に、リスト ボックスに変更が表示されます。ただし、データテーブルに加えた変更 (ApplyChanges メソッド) をデータベース サーバーにフラッシュするまでは、データのローカル コピーを変更するだけです。それは良いことも悪いこともあります。複数のユーザーが同時に製品を更新する場合に何をしたいかによって異なります。

これで、ローカル コピーを含むデータ テーブルが表示されました。次に、コピーしたテーブルを更新しましたが、コピーがずれています。アプリの別のコピーを実行して、最初のコピーで既に表示されているレコードの 1 つを変更した場合に発生するのとまったく同じ問題です。

于 2013-03-15T18:49:32.483 に答える