2010-08-18 5 views
1

J'essaie d'attacher une classe d'objets ADO EF (Materials) à un ListBox et de le mettre à jour automatiquement lorsqu'un nouveau matériel est ajouté à la base de données.Databind ADO.NET Entity Framework à ListBox

Dans mon code actuel ci-dessous, il affichera tous les éléments qui sont dans la base de données avant que la source de données de contrôles ne soit définie, mais elle ne sera pas mise à jour. Je sais qu'il me manque quelque chose d'élémentaire ici. Toute aide est grandement appréciée!

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

Répondre

1

C'est parce que db.Materials ne soulève pas une notification lorsqu'un élément est ajouté. Vous devez utiliser un BindingList<T> comme 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); 
    } 
} 

(Ce code suppose que votre classe AddMaterial ajoute le nouvel élément à la DB et il expose à une propriété NewMaterial)

+0

J'aime votre solution, est pourtant là un moyen plus facile? Le cadre d'entité ne devrait-il pas déclencher un événement lorsqu'un élément est ajouté? – WedTM

+0

Eh bien, db.Materials n'est pas exactement une collection, c'est une requête. Vous ne "ajoutez" pas d'éléments: vous les ajoutez à la base de données, et la prochaine fois que vous exécutez la requête, les nouveaux éléments seront retournés. Il ne serait donc pas logique de faire une notification dans ce cas –

Questions connexes