我使用来自ms access数据库的listbox数据源创建一个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";
}
答案 0 :(得分:0)
您正在这样做,您需要清除并重新填充您的列表框。
您应该从FormLoad事件处理程序中提取该代码作为方法,并在运行更新查询后调用它。
很难说你想要走哪条路。根据你的要求。 您应该做的是使您的产品数据表成为私有财产。创建并打开它并绑定到列表框。
然后你的更新功能应该改变数据表。然后,您会在列表框中看到更改。需要注意的是,直到您将对数据表所做的更改(ApplyChanges方法)刷新回数据库服务器,您所做的就是更改数据的本地副本。 这可能是好事也可能是坏事。取决于您希望多个用户同时更新产品的目的。
所以你有一个带有本地副本的数据表并显示出来。 然后你已经更新了你复制的表格,现在你的副本已经不合时宜了。 如果您运行了应用程序的另一个副本并更改了第一个已经显示的记录,那么您将遇到的问题完全相同。