2016-11-08 5 views
0

У меня есть две таблицы базы данных SQL Server, которые являются машиной и ошибкой. На столе машины есть вся информация о конкретной машине на моем сайте. В таблице неисправностей хранятся все механические неисправности, связанные с конкретной машиной, то есть одна машина может иметь много сбоев (от одного до многих отношений). У меня есть источник данных, привязанный к объекту Machine. Это означает, что в результате у меня есть набор ошибок внутри этого объекта. Я использую элемент управления Windows Form BindingNavigator для перехода к каждой машине в моей системе. Я могу просмотреть каждую информацию о машине. Тем не менее, я изо всех сил пытаюсь просмотреть все ошибки, связанные с выбранной машиной в DataGridView. Как я могу получить все ошибки, связанные с машиной в DataGridView. На моем классе Machine у ​​меня есть свойство get, которое возвращает все ошибки, вызванные MachineID. Таким образом, в моем объекте «Свойство объекта» свойство «Ошибки» возвращает коллекцию сбоев, как указано в приведенном ниже коде. Пожалуйста помогите?Связывание коллекции внутри объекта источника данных с DataGridView в 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

Я думаю, вы должны использовать 'DataRelation' для просмотра иерархических данных в стандартном DataGridView. См. этот http://www.codeproject.com/Articles/28276/DataGridView-with-hierarchical-data-binding. Другим вариантом может быть использование двух сеток в формате master/detail. – Crowcoder

ответ

0

Хитрость заключается в том, чтобы связать мастер сетку с помощью BindingSource, а затем связать детали сетки DataSource свойство того же источника связывания.

Вот полный рабочий демо:

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

Существенная часть:

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

Заменить Master с Machine, Detail с Fault, "Детали" с «Faults` и результат будет быть вашей моделью.

+0

Спасибо @ Иван. Кажется, я добираюсь туда. Однако у моего bsMaster нет никаких данных. Теперь я могу отображать dataGridView, но без каких-либо данных. Я думаю, что я застрял в запросе, который возвращает только ошибки с тем же MachineID, что и Master Machine.MachineID. Я использую LINQ для Entities, и вот мой код, который я уверен, что он не делает правильные вещи. Пожалуйста, помогите мне –

+0

Трудно сказать, в чем проблема, не имея [mcve]. Запрос выглядит нормально, только странно, что запрос выполняется для каждого свойства getter - рассмотрим использование поля поддержки. Но опять же, это может быть или не быть проблемой. Если вы можете предоставить воспроизводимый пример, я буду рад помочь, иначе я ничего не могу сделать, –