添加到GridView之前的分组列表

时间:2019-05-02 08:25:21

标签: c# winforms

我有将此代码添加到列表中的代码

private void GetParts(bool AllObjects)
{
    ModelObjectEnumerator ImportModel = null;
    List<Beam> parts = new List<Beam>();
    if (AllObjects)
    {
        ImportModel = MyModel.GetModelObjectSelector().GetAllObjectsWithType(ModelObject.ModelObjectEnum.BEAM);
    }
    else
    {
        TSMUI.ModelObjectSelector GetSelectedObjects = new TSMUI.ModelObjectSelector();
        ImportModel = GetSelectedObjects.GetSelectedObjects();
    }

    while (ImportModel.MoveNext())
    {
        Beam ThisBeam = ImportModel.Current as Beam;

        if (ThisBeam != null)
        {
            parts.Add(ThisBeam);

        }
    }

在那之后,我应该遍历所有项以这样的方式添加到GridView中

for (int i = 0; i < parts.Count; i++)
{ 
        DataRow row = dt.NewRow();

        var partMark = string.Empty;
        parts[i].GetReportProperty("PART_POS", ref partMark);
        row[0] = partMark;
        row[1] = parts[i].Profile.ProfileString;
        int num = 0;
        row[2] = parts[i].GetReportProperty("MODEL_TOTAL", ref num);
        double length = 0;
        parts[i].GetReportProperty("LENGTH", ref length);
        row[3] = length;
        dt.Rows.Add(row);
}

但是在我这样做之前,我想使用(partMark,length)和Sum(num)对项目进行分组。

我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:1)

听起来您想做的是按partMark和长度对项目进行分组,然后按num的总和对列表中的分组项目进行排序。我建议使用LINQ进行分组/排序。

使用IEnumerable的GroupBy方法时,返回类型为IEnumerable>。这意味着您无法将项目列表重新组合到自身中,这是我在试图回答此问题时的首次尝试。

为解决此问题,我创建了一个名为GroupedPart的类,该类具有与Part相同的字段,但是添加了一个“ Parts”属性来包含由PartLength和PartMark分组在一起的Part对象的列表。

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    public class Part
    {
        public String Name {get; set;}
        public double PartLength {get; set;}
        public double PartMark {get; set;}
        public int Number {get; set;}

        public Part(String partName, double length, double mark, int value)
        {
            Name = partName;
            PartLength = length;
            PartMark = mark;
            Number = value;
        }
    }

    public class GroupedPart
    {
        public String Name => Parts.First().Name;
        public double PartLength { get; set; }
        public double PartMark { get; set; }
        public int Number { get; set; }
        public List<Part> Parts { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }
}

然后,在创建了支持对象之后,您可以使用此代码对它们进行分组和排序。第二个代码块只是一个带有DataGridView的Form对象,因此可以看到分组和排序的结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private List<Part> parts;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            parts = new List<Part>();
            parts.Add(new Part("Hammer #1", 1, 5, 3));
            parts.Add(new Part("Hammer #2", 1, 5, 4));
            parts.Add(new Part("Hammer #3", 1, 1, 6));

            parts.Add(new Part("Nail #1", 7, 10, 14));
            parts.Add(new Part("Nail #2", 8, 10, 13));
            parts.Add(new Part("Nail #3", 9, 10, 15));

            parts.Add(new Part("Screw", 16, 17, 18));

            var results = parts.GroupBy(part => new {part.PartLength, part.PartMark})
                .Select(grouped => new GroupedPart()
                {
                    PartLength = grouped.Key.PartLength,
                    PartMark = grouped.Key.PartMark,
                    Parts = grouped.ToList()
                })
                .OrderBy(p => p.Parts.Sum(part => part.Number));

            List<GroupedPart> groupedParts = results.ToList();

            dataGridView1.DataSource = groupedParts;
        }
    }
}

如果运行此代码,您将看到Hammer#1和Hammer#2分组在一起,因为它们具有相同的PartLength和PartMark。由于其他零件具有唯一的PartLength / PartMark组合,因此它们被单独分组。此外,您将看到“指甲”部分(指甲#1,指甲2,指甲3)已重新排序(指甲2,指甲1,指甲3),因为它们分配了“数字”属性。如果注释掉OrderBy代码行,您将看到Hammer对象仍然分组在一起,但是Nail对象恢复为原始顺序。