2010-08-18 116 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