在c#中将数据源对象中的集合绑定到DataGridView

本文关键字:集合 绑定 DataGridView 对象 数据源 | 更新日期: 2023-09-27 18:17:05

我确实有两个sql server数据库表,分别是Machine和Fault。机器表有关于一个特定的机器在我的网站上的所有信息。故障表存储与特定机器相关联的所有机械故障,即一台机器可以有多个故障(一对多关系)。我确实有一个绑定到Machine对象的数据源。这意味着,作为结果,我在这个对象中确实有一个fault集合。我使用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
            }
        }

在c#中将数据源对象中的集合绑定到DataGridView

技巧是通过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,"Details"替换为"Faults",结果将是您的模型。