我有一個組合框和一個datagridview控件的窗體。組合框由數據庫表填充,並存儲交易ID。基於Combobox值更新DataGridView
更新組合框時,Datagridview綁定到數據庫表,並顯示與組合框中的事務ID關聯的記錄。
cboTransaction_SelectionChangeCommitted(object sender, EventArgs e)
{
int id = Convert.ToInt32(cboTransaction.SelectedValue);
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
dgv.DataSource = bs;
}
對於第一個記錄,這工作正常。用戶可以選擇一個事務ID並在DataGridView中添加/編輯項目記錄而不會出現問題。
但是,當用戶從組合框中選擇不同的事務時,事情會變得有點混亂。使用上面的代碼,DataGridView不會清除具有舊ID號的行,但會顯示舊記錄+新選定事務的任何記錄。我假定Where()子句將DataGridView限制爲事務ID匹配的那些項目。
如果我將db.SaveChanges();
和dgv.Rows.Clear();
添加到該塊的開頭,則會成功清除行,但不會將更改保存到數據庫。
我也曾嘗試
db.Items.Load();
bs.DataSource = db.Items.Local.ToBindingList().Where(i => i.TransactionId == id);
這結合在DataGridView到正確的交易,但不允許用戶添加任何新記錄。
如何確保datagridview僅顯示與所需事務相關的記錄,同時仍允許用戶添加/編輯記錄?
EDIT
我創建一個文本框,按鈕和用於的datagridview測試的測試形式,並具有相同的結果。 Datagridview具有正在編輯的數據庫表的數據源。
public partial class frmTest : Form
{
private BindingSource bs = new BindingSource();
private UniformDataContainer db = new UniformDataContainer();
public frmTest()
{
InitializeComponent();
dataGridView1.DataSource = bs;
}
private void button1_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(textBox1.Text.ToString());
db.Items.Where(i => i.TransactionId == id).Load();
bs.DataSource = db.Items.Local.ToBindingList();
bs.ResetBindings(false);
}
private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
db.SaveChanges();
}
}
在調試代碼,我發現db.Items.Local
仍然包含舊行,似乎並不清楚。
沒有運氣我很害怕。 我已經創建了一個單獨的測試表單(請參閱上面編輯的問題),但datagridview仍然顯示以前的記錄。我也注意到db.Items.Local仍然保存着以前的數據庫記錄。 –
看到我的編輯,希望對你有用:) – gzaxx
你的編輯清除了datagridview,但是它不會向數據庫添加新記錄。我瞎了,並認爲我通過使用'db.Items.Local.Clear()',但它只會保存最近添加的記錄。 –