2010-08-18 148 views
1

我試圖附加一個ADO EF對象類(材料)到一個列表框,並讓它自動更新時,新的材料添加到數據庫。Databind ADO.NET實體框架到列表框

在我當前的代碼中,它將顯示控件數據源設置之前數據庫中的任何項目,但不會更新。

我知道我在這裏錯過了一些基本的東西。任何幫助是極大的讚賞!

public partial class Main : KryptonForm 
{ 
    private AGAEntities db = new AGAEntities(); 
    public Main() 
    { 
     InitializeComponent(); 
    } 

    private void Main_Load(object sender, EventArgs e) 
    { 
     matList.DataSource = db.Materials; 
     matList.DisplayMember = "Name"; 
    } 

    private void newMat_Click(object sender, EventArgs e) 
    { 
     AddMaterial form = new AddMaterial(); 
     form.ShowDialog(); 
    } 
} 

回答

1

這是因爲db.Materials在添加項目時不會發出通知。您應該使用BindingList<T>DataSource

private BindingList<Material> _materials; 

private void Main_Load(object sender, EventArgs e) 
{ 
    _materials = new BindingList<Material>(db.Materials); 
    matList.DataSource = _materials; 
    matList.DisplayMember = "Name"; 
} 

private void newMat_Click(object sender, EventArgs e) 
{ 
    AddMaterial form = new AddMaterial(); 
    if (form.ShowDialog() == DialogResult.OK) 
    { 
     _materials.Add(form.NewMaterial); 
    } 
} 

(此代碼假定您AddMaterial類增加了新的項目數據庫,並公開它通過NewMaterial屬性)

+0

我喜歡你的解決方案,但是有更簡單的方法?實體框架在添加項目時不應該引發事件嗎? – WedTM 2010-08-18 22:35:17

+0

那麼,db.Materials不完全是一個集合,它是一個查詢。您不會「添加」項目:將它們添加到數據庫,並且在下次執行查詢時,將返回新項目。所以在這種情況下提出通知是沒有意義的 – 2010-08-18 23:42:40