2010-08-18 5 views
1

Я пытаюсь подключить класс объектов ADO EF (Материалы) к ListBox и автоматически обновлять его, когда новый материал добавляется в базу данных.Databind ADO.NET Entity Framework to ListBox

В моем текущем коде ниже будут показаны все элементы, находящиеся в базе данных, до того, как будет установлен источник данных управления, но он не будет обновлен.

Я знаю, что мне не хватает чего-то элементарного здесь. Любая помощь очень ценится!

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

+0

Ну, db.Materials - это не совсем коллекция, это запрос. Вы не добавляете к нему элементы: вы добавляете их в базу данных, и при следующем выполнении запроса будут возвращены новые элементы. Поэтому нет смысла поднимать уведомление в этом случае –