2013-06-13 153 views
0

我有一個組合框和一個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仍然包含舊行,似乎並不清楚。

回答

0

我設法解決它/我的數據庫Conext處置周圍破解,並重新連接:

db.Dispose(); 
db = new UniformDataContainer(); 
int id = Convert.ToInt32(textBox1.Text); 
db.Items.Where(i => i.TransactionId == id).Load(); 
bs.DataSource = db.Items.Local.ToBindingList(); 

這節省了上一個事務的現有記錄,並清除選擇新交易後的數據網格。

感謝@gzaxx和@SerkanOzvatan的迴應!

1

更改後不重新鍵入DataSourceDataGridView,請調用ResetBindings方法,該方法應該使用新值重置網格。

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(); 

    bs.ResetBindings(false); 
} 

嘗試一下,看看有沒有什麼固定你的問題,如果不是我有一個建議,但是這應該做的工作:)

編輯

好你的編輯後,我見問題。首先,你要清楚你的DB類或綁定的本地緩存到您的where子句:

cboTransaction_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    int id = Convert.ToInt32(cboTransaction.SelectedValue); 

    var bindinglist = new BindingList(db.Items.Where(i => i.TransactionId == id).ToList()); 
    bs.DataSource = bindinglist; 

    bs.ResetBindings(false); 
} 
+0

沒有運氣我很害怕。 我已經創建了一個單獨的測試表單(請參閱上面編輯的問題),但datagridview仍然顯示以前的記錄。我也注意到db.Items.Local仍然保存着以前的數據庫記錄。 –

+0

看到我的編輯,希望對你有用:) – gzaxx

+0

你的編輯清除了datagridview,但是它不會向數據庫添加新記錄。我瞎了,並認爲我通過使用'db.Items.Local.Clear()',但它只會保存最近添加的記錄。 –

0

你必須設置網格的DataSource設置之前爲null。就像這樣:

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 = null; 
    dgv.DataSource = bs; 
} 
+0

當'id'發生變化時,這不會刪除以前的記錄。 –