【问题标题】:Binding a collection inside a data source object to a DataGridView in C#在 C# 中将数据源对象内的集合绑定到 DataGridView
【发布时间】:2017-03-22 15:44:56
【问题描述】:

我确实有两个 sql server 数据库表,它们是 Machine 和 Fault。机器表在我的网站上有关于特定机器的所有信息。故障表存储与特定机器相关的所有机械故障,即一台机器可以有许多故障(一对多关系)。我确实有一个绑定到 Machine 对象的数据源。这意味着结果我在这个对象中有一个故障集合。我正在使用 Windows 窗体控件 BindingNavigator 导航到系统中的每台机器。我能够查看每台机器的信息。但是,我很难在 DataGridView 中查看与所选机器相关的所有故障。如何在 DataGridView 中获取与机器相关的所有故障。在我的 Machine 类上,我有一个 get 属性,它返回给定 MachineID 的所有故障。因此,在我的 Machine 对象中,Faults 属性返回了一组错误,如下面的代码所示。请帮忙?

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

【问题讨论】:

  • 我认为您必须使用DataRelations 在标准DataGridView 中查看分层数据。请参阅此codeproject.com/Articles/28276/…。另一种选择是使用两个主/详细格式的网格。

标签: c# winforms datagridview objectdatasource bindingsource


【解决方案1】:

诀窍是通过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,将“详细信息”替换为“故障”,结果将是您的模型。

【讨论】:

  • 谢谢@Ivan。看来我快到了。但是,我的 bsMaster 没有任何数据。我现在可以显示 dataGridView 但上面没有任何数据。我在想我被困在只返回与 Master Machine.MachineID 相同 MachineID 的故障的查询上。我正在使用 LINQ to Entities,这是我的代码,我确信它没有做正确的事情。请帮帮我
  • 如果没有minimal reproducible example,很难说出确切的问题是什么。查询看起来不错,唯一奇怪的是查询是在每个属性 getter 上执行的 - 考虑使用支持字段。但同样,这可能是也可能不是问题。如果你能提供可重现的例子,我很乐意提供帮助,否则我无能为力,
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多