2016-11-08 1 views
0

Ich habe zwei SQL Server-Datenbanktabellen, die Maschine und Fehler sind. Maschinentisch haben alle Informationen zu einer bestimmten Maschine hier auf meiner Website. Fehlertabelle speichert alle mechanischen Fehler, die mit einer bestimmten Maschine verbunden sind, dh eine Maschine kann viele Fehler haben (Eins-zu-Viele-Beziehung). Ich habe eine Datenquelle, die an das Machine-Objekt gebunden ist. Was bedeutet, dass ich eine Sammlung von Fehlern in diesem Objekt habe. Ich verwende das Windows Form-Steuerelement BindingNavigator, um zu jedem Computer in meinem System zu navigieren. Ich kann jede Maschineninformation einsehen. Ich habe jedoch Schwierigkeiten, alle Fehler anzuzeigen, die mit dem ausgewählten Computer in DataGridView verknüpft sind. Wie kann ich alle Fehler erhalten, die mit der Maschine in DataGridView verbunden sind. Auf meiner Machine-Klasse habe ich eine Get-Eigenschaft, die alle Fehler zurückgibt, die einer MachineID zugewiesen wurden. Also, innerhalb meiner Machine-Objekt Fehler Eigenschaft gibt eine Sammlung von Fehlern wie im folgenden Code angezeigt. Bitte helfen?Binden einer Auflistung in einem Datenquellenobjekt an eine DataGridView in 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

Ich denke, dass Sie 'DataRelation's verwenden müssen, um hierarchische Daten im Standard-DataGridView anzuzeigen. Sehen Sie dieses http://www.codeproject.com/Articles/28276/DataGridView-with-hierarchical-data-binding. Eine andere Option könnte die Verwendung von zwei Gittern im Master-/Detailformat sein. – Crowcoder

Antwort

0

Der Trick ist das Master-Gitter über BindingSource und binden dann das Detail grid Datasource Eigenschaft auf die gleiche Bindungsquelle zu binden.

Hier ist ein voll funktions Demo:

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

Der wesentliche Teil ist:

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

Master Ersetzen mit Machine, Detail mit Fault, "Details" mit „Faults` und das Ergebnis wird Seien Sie Ihr Modell

+0

Danke @Ivan. Es scheint, ich komme dorthin. Mein bsMaster hat jedoch keine Daten. Ich bin jetzt in der Lage, das dataGridView anzuzeigen, aber ohne irgendwelche Daten darüber. Ich denke, dass ich an der Abfrage festhalte, die nur Fehler mit der gleichen MachineID wie der Master Machine.MachineID zurückgibt. Ich verwende LINQ zu Entitäten und hier ist mein Code, der sicher ist, dass er nicht das Richtige tut. Bitte helfen Sie mir –

+0

Es ist schwer zu sagen, was das genaue Problem ohne [MCVE] ist. Die Abfrage sieht in Ordnung aus, die einzige seltsame Sache ist, dass die Abfrage auf jedem Eigenschaften-Getter ausgeführt wird - ziehen Sie in Erwägung, ein Unterstützungsfeld zu verwenden. Aber auch dies könnte oder könnte nicht das Problem sein. Wenn Sie ein reproduzierbares Beispiel liefern können, werde ich gerne helfen, sonst kann ich nichts machen, –

Verwandte Themen