2016-11-08 14 views
0

でのDataGridViewにデータソースオブジェクトの内部コレクションを結合。マシンテーブルは、私のサイトの特定のマシンに関するすべての情報を持っています。障害テーブルには、特定のマシンに関連するすべての機械的障害が格納されます。つまり、1つのマシンに多数の障害(1対多の関係)がある可能性があります。私は、Machineオブジェクトにバインドされたデータソースを持っています。つまり、私はこのオブジェクトの中にフォールトのコレクションを持っています。私はWindows FormコントロールBindingNavigatorを使用して、システム内の各マシンに移動しています。私は各マシンの情報を見ることができます。しかし、私はDataGridViewで選択したマシンに関連するすべての障害を表示するのに苦労しています。 DataGridViewでマシンに関連付けられたすべての障害を取得するにはどうすればよいですか。私のMachineクラスでは、MachineIDが与えられているすべてのフォルトを返すgetプロパティがあります。したがって、私のMachineオブジェクト内のFaultsプロパティは、以下のコードに示すようなフォールトのコレクションを返しています。手伝ってください?私はマシンとフォールトをされている2つのSQL Serverデータベースのテーブルを持っています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

私はあなたが標準のDataGridViewで階層データを表示するために、 'DataRelation'sを使用する必要が考えて、このHTTPを参照してください。/ /www.codeproject.com/Articles/28276/DataGridView-with-hierarchical-data-binding。もう1つの選択肢は、マスター/ディテールの形式で2つのグリッドを使用することです。 – Crowcoder

答えて

0

トリックBindingSource介してマスタグリッドに結合し、次いで、同じ結合ソースに詳細グリッドデータソース性を結合することです。ここで

が完全に動作するデモです:

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

は不可欠です:「Faults`となりますと

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

は、MachineFaultDetailMasterを交換し、 "詳細" 。あなたのモデルになる

+0

@Ivanありがとうございます。私はそこに着いているようだ。しかし、私のbsMasterにはデータがありません。私は今、dataGridViewを表示することができますが、データは表示されません。私は、Master Machine.MachineIDと同じMachineIDでFaultsのみを返すクエリに悩まされていると思っています。私はエンティティにLINQを使用していますが、私は正しいことをしていないと確信しています。助けてください –

+0

[mcve]を持っていても何が問題なのかは分かりません。クエリは大丈夫ですが、奇妙なことは、各プロパティゲッタでクエリが実行されることです。バッキングフィールドの使用を検討してください。しかし、これもまた問題であるかもしれないし、そうでないかもしれない。再現可能な例を提供できれば、私は喜んで助けてくれるでしょう、そうでないと私は何もできません。 –

関連する問題