2016-11-08 4 views
0

J'ai deux tables de base de données de serveur sql, qui sont Machine et Fault. La table machine contient toutes les informations concernant une machine spécifique sur mon site. La table des défauts stocke tous les défauts mécaniques associés à une machine spécifique, c'est-à-dire qu'une machine peut avoir de nombreux défauts (relation un à plusieurs). J'ai une source de données qui est liée à l'objet Machine. Ce qui signifie que j'ai une collection de fautes dans cet objet. J'utilise le contrôle Windows Form BindingNavigator pour naviguer vers chaque machine de mon système. Je suis capable de voir les informations de chaque machine. Cependant, j'ai du mal à voir tous les défauts associés à la machine sélectionnée dans DataGridView. Comment puis-je obtenir tous les défauts associés à la machine dans DataGridView. Sur ma classe Machine, j'ai une propriété get qui retourne toutes les fautes avec un MachineID. Ainsi, dans ma propriété Machine, les faults retournent une collection de fautes comme indiqué sur le code ci-dessous. Veuillez aider?Liaison d'une collection à l'intérieur d'un objet de source de données à un DataGridView en C#

public override ICollection<Fault> Faults 
{ 
     get 
     { 
      //returning all faults associated with a given machine 
      using (var context = new AllEntities()) 
      { 
       var faultsList = (from f in context.Faults 
            where f.MachineID == MachineID 
            select f).ToList<Fault>(); 

       return faultsList; //return the list of faults 
      } 
     } 
+0

Je pense que vous devez utiliser 'DataRelation's pour afficher les données hiérarchiques dans le DataGridView standard. /www.codeproject.com/Articles/28276/DataGridView-with-hierarchy-data-binding. Une autre option pourrait être d'utiliser deux grilles dans le format maître/détail. – Crowcoder

Répondre

0

L'astuce consiste à lier le réseau principal via BindingSource et lier ensuite la grille de détail DataSource propriété à la même source de liaison.

Voici une démonstration de travail complet:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace Samples 
{ 
    public class Master 
    { 
     public string Name { get; set; } 
     public ICollection<Detail> Details { get; set; } 
    } 

    public class Detail 
    { 
     public string Name { get; set; } 
    } 

    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      var form = new Form(); 
      var split = new SplitContainer { Dock = DockStyle.Fill, Parent = form, Orientation = Orientation.Horizontal }; 
      var dgvMaster = new DataGridView { Dock = DockStyle.Fill, Parent = split.Panel1 }; 
      var dgvDetail = new DataGridView { Dock = DockStyle.Fill, Parent = split.Panel2 }; 
      var data = Enumerable.Range(1, 10).Select(p => new Master 
      { 
       Name = "P" + p, 
       Details = Enumerable.Range(1, 10).Select(c => new Detail 
       { 
        Name = "C" + p + "." + c, 
       }).ToList() 
      }).ToList(); 

      var bsMaster = new BindingSource { DataSource = data }; 
      dgvMaster.DataSource = bsMaster; 
      dgvDetail.DataBindings.Add("DataSource", bsMaster, "Details", true, DataSourceUpdateMode.Never); 

      Application.Run(form); 
     } 
    } 
} 

La partie essentielle est:

var bsMaster = new BindingSource { DataSource = data }; 
dgvMaster.DataSource = bsMaster; 
dgvDetail.DataBindings.Add("DataSource", bsMaster, "Details", true, DataSourceUpdateMode.Never); 

Remplacer Master avec Machine, Detail avec Fault, "Détails" avec « Faults` et le résultat Soyez votre modèle

+0

Merci @Ivan. Il semble que j'y arrive. Cependant, mon bsMaster n'a aucune donnée. Je suis maintenant en mesure d'avoir le dataGridView affiché mais sans aucune donnée dessus. Je pense que je suis bloqué sur la requête qui retourne seulement des failles avec le même ID machine que la machine maître.MachineID. J'utilise LINQ to Entities et voici mon code dont je suis sûr qu'il ne fait pas la bonne chose. S'il vous plaît aidez-moi –

+0

Il est difficile de dire quel est le problème exact sans avoir [mcve]. La requête semble correcte, la seule chose étrange est que la requête est exécutée sur chaque getter de propriété - pensez à utiliser un backing field. Mais encore une fois, cela pourrait ou ne pourrait pas être le problème. Si vous pouvez fournir un exemple reproductible, je serai heureux de vous aider, sinon je ne peux rien faire, –