C# 如何对DataGridView进行分组?

C# 如何对DataGridView进行分组?,c#,datagridview,C#,Datagridview,我当前的DataGridView如下所示: DataGridViewGrouper grouper = new DataGridViewGrouper(dataGridView); grouper.SetGroupOn("Fachanwendung"); //grouper.SetGroupOn(this.dataGridView.Columns["fachanwendung"]); 我希望实现每个(列)“Fachanwendung”通过将数据显示为标题来分组数据。我在DataGridVie

我当前的DataGridView如下所示:

DataGridViewGrouper grouper = new DataGridViewGrouper(dataGridView);
grouper.SetGroupOn("Fachanwendung");
//grouper.SetGroupOn(this.dataGridView.Columns["fachanwendung"]);

我希望实现每个(列)“Fachanwendung”通过将数据显示为标题来分组数据。我在DataGridViewGrouper上尝试过,如下所示:

不幸的是,我的数据源和数据成员要么为null,要么为“”。因此我不能这样称呼它:

DataGridViewGrouper grouper = new DataGridViewGrouper(dataGridView);
grouper.SetGroupOn("Fachanwendung");
//grouper.SetGroupOn(this.dataGridView.Columns["fachanwendung"]);

是否有其他方法在特定行上显示(至少一个文本)?

我现在得到了您的要求,基本上您希望在数据网格视图中为每个组设置一个块。可以使用嵌套网格视图解决此问题。这里有一个很好的链接,你可以使用


此外,如果您不想扩展折叠功能,您可以轻松删除该功能。如果您需要帮助,请告诉我。

我现在收到了您的要求,基本上您希望在数据网格视图中为每个组设置一个块。可以使用嵌套网格视图解决此问题。这里有一个很好的链接,你可以使用


此外,如果您不想扩展折叠功能,您可以轻松删除该功能。如果您需要帮助,请告诉我。

我创建了一个数据表,您可以将其用作DGV的数据源。见下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication98
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Element> elements = new List<Element>() {
                new Element() {  Fachanwendung = "archiMap", Elementtyp = "Herstellerproduktversion", Elementname = "Java SE JRE 8", Date = DateTime.Parse("1/1/2017"), Quantity = 10},
                new Element() {  Fachanwendung = "archiMap", Elementtyp = "Herstellerproduktversion", Elementname = "Microsoft Window Server 2012 Standard", Date = DateTime.Parse("3/1/2017"), Quantity = 12},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Apache Toimcat 8.0", Date = DateTime.Parse("6/1/2018"), Quantity = 5},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Oracle Java JDK 7", Date = DateTime.Parse("12/1/2018"), Quantity = 5},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Oracle Java JDK 8", Date = DateTime.Parse("1/1/2019"), Quantity = 5}
            };

            Dictionary<string, List<Element>> dict = elements.GroupBy(x => x.Fachanwendung, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

            DataTable dt = new DataTable();
            dt.Columns.Add("Fachanwendung", typeof(string));
            dt.Columns.Add("Elementtyp", typeof(string));
            dt.Columns.Add("Elementname", typeof(string));

            //add quarters
            DateTime minDate = dict.SelectMany(x =>  x.Value.Select(y => y.Date)).Min(x => x.Date);
            DateTime maxDate = dict.SelectMany(x => x.Value.Select(y => y.Date)).Max(x => x.Date);

            DateTime startQuarter = new DateTime(minDate.Year, ((minDate.Month - 1) % 3) + 1, 1);
            DateTime endQuarter = new DateTime(maxDate.Year, ((maxDate.Month - 1) % 3) + 1, 1);

            for (DateTime date = startQuarter; date <= endQuarter; date = date.AddMonths(3))
            {
                dt.Columns.Add(date.Year.ToString() + " Q" + (((date.Month - 1)/ 3) + 1).ToString(), typeof(int));
            }

            foreach (KeyValuePair<string, List<Element>> rows in dict)
            {
                var groups = dict[rows.Key].GroupBy(x => new { Elementtyp = x.Elementtyp, Elementname = x.Elementname, Date = new DateTime(x.Date.Year, ((x.Date.Month - 1) % 3) + 1, 1) }).ToList();
                foreach (var group in groups)
                {
                    DataRow newRow = dt.Rows.Add();
                    newRow["Fachanwendung"] = rows.Key;
                    newRow["Elementtyp"] = group.Key.Elementtyp;
                    newRow["Elementname"] = group.Key.Elementname;
                    string quarter = group.Key.Date.Year.ToString() + " Q" + (((group.Key.Date.Month - 1) / 3) + 1).ToString();
                    int total = group.Sum(x => x.Quantity);
                    newRow[quarter] = total;
                }

            }

        }
    }
    public class Element
    {
        public string Fachanwendung { get; set; }
        public string Elementtyp { get; set; }
        public string Elementname { get; set; }
        public DateTime Date { get; set; }
        public int Quantity { get; set; } 
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序98
{
班级计划
{
静态void Main(字符串[]参数)
{
列表元素=新列表(){
新元素(){Fachanwendung=“archiMap”,Elementtyp=“Herstellerproduktversion”,Elementname=“Java SE JRE 8”,Date=DateTime.Parse(“1/1/2017”),Quantity=10},
新元素(),
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Apache Toimcat 8.0”,Date=DateTime.Parse(“6/1/2018”),Quantity=5},
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Oracle Java JDK 7”,Date=DateTime.Parse(“12/1/2018”),Quantity=5},
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Oracle Java JDK 8”,Date=DateTime.Parse(“1/1/2019”),Quantity=5}
};
Dictionary dict=elements.GroupBy(x=>x.Fachanwendung,y=>y)
.ToDictionary(x=>x.Key,y=>y.ToList());
DataTable dt=新的DataTable();
dt.Columns.Add(“Fachanwendung”,typeof(string));
添加(“Elementtyp”,typeof(string));
添加(“Elementname”,typeof(string));
//加四分之一
DateTime minDate=dict.SelectMany(x=>x.Value.Select(y=>y.Date)).Min(x=>x.Date);
DateTime maxDate=dict.SelectMany(x=>x.Value.Select(y=>y.Date)).Max(x=>x.Date);
DateTime startQuarter=新日期时间(minDate.Year,((minDate.Month-1)%3)+1,1);
DateTime endQuarter=新日期时间(maxDate.Year,((maxDate.Month-1)%3)+1,1);
对于(DateTime date=startQuarter;datenew{Elementtyp=x.Elementtyp,Elementname=x.Elementname,date=newdatetime(x.date.Year,((x.date.Month-1)%3)+1,1)});
foreach(组中的var组)
{
DataRow newRow=dt.Rows.Add();
newRow[“Fachanwendung”]=rows.Key;
newRow[“Elementtyp”]=group.Key.Elementtyp;
newRow[“Elementname”]=group.Key.Elementname;
字符串季度=group.Key.Date.Year.ToString()+“Q”+((group.Key.Date.Month-1)/3)+1.ToString();
int total=组和(x=>x.Quantity);
纽罗[季度]=总计;
}
}
}
}
公共类元素
{
公共字符串Fachanwendung{get;set;}
公共字符串Elementtyp{get;set;}
公共字符串Elementname{get;set;}
公共日期时间日期{get;set;}
公共整数数量{get;set;}
}
}

我创建了一个数据表,您可以将其用作DGV的数据源。见下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication98
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Element> elements = new List<Element>() {
                new Element() {  Fachanwendung = "archiMap", Elementtyp = "Herstellerproduktversion", Elementname = "Java SE JRE 8", Date = DateTime.Parse("1/1/2017"), Quantity = 10},
                new Element() {  Fachanwendung = "archiMap", Elementtyp = "Herstellerproduktversion", Elementname = "Microsoft Window Server 2012 Standard", Date = DateTime.Parse("3/1/2017"), Quantity = 12},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Apache Toimcat 8.0", Date = DateTime.Parse("6/1/2018"), Quantity = 5},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Oracle Java JDK 7", Date = DateTime.Parse("12/1/2018"), Quantity = 5},
                new Element() {  Fachanwendung = "Event Management System", Elementtyp = "Herstellerproduktversion", Elementname = "Oracle Java JDK 8", Date = DateTime.Parse("1/1/2019"), Quantity = 5}
            };

            Dictionary<string, List<Element>> dict = elements.GroupBy(x => x.Fachanwendung, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

            DataTable dt = new DataTable();
            dt.Columns.Add("Fachanwendung", typeof(string));
            dt.Columns.Add("Elementtyp", typeof(string));
            dt.Columns.Add("Elementname", typeof(string));

            //add quarters
            DateTime minDate = dict.SelectMany(x =>  x.Value.Select(y => y.Date)).Min(x => x.Date);
            DateTime maxDate = dict.SelectMany(x => x.Value.Select(y => y.Date)).Max(x => x.Date);

            DateTime startQuarter = new DateTime(minDate.Year, ((minDate.Month - 1) % 3) + 1, 1);
            DateTime endQuarter = new DateTime(maxDate.Year, ((maxDate.Month - 1) % 3) + 1, 1);

            for (DateTime date = startQuarter; date <= endQuarter; date = date.AddMonths(3))
            {
                dt.Columns.Add(date.Year.ToString() + " Q" + (((date.Month - 1)/ 3) + 1).ToString(), typeof(int));
            }

            foreach (KeyValuePair<string, List<Element>> rows in dict)
            {
                var groups = dict[rows.Key].GroupBy(x => new { Elementtyp = x.Elementtyp, Elementname = x.Elementname, Date = new DateTime(x.Date.Year, ((x.Date.Month - 1) % 3) + 1, 1) }).ToList();
                foreach (var group in groups)
                {
                    DataRow newRow = dt.Rows.Add();
                    newRow["Fachanwendung"] = rows.Key;
                    newRow["Elementtyp"] = group.Key.Elementtyp;
                    newRow["Elementname"] = group.Key.Elementname;
                    string quarter = group.Key.Date.Year.ToString() + " Q" + (((group.Key.Date.Month - 1) / 3) + 1).ToString();
                    int total = group.Sum(x => x.Quantity);
                    newRow[quarter] = total;
                }

            }

        }
    }
    public class Element
    {
        public string Fachanwendung { get; set; }
        public string Elementtyp { get; set; }
        public string Elementname { get; set; }
        public DateTime Date { get; set; }
        public int Quantity { get; set; } 
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序98
{
班级计划
{
静态void Main(字符串[]参数)
{
列表元素=新列表(){
新元素(){Fachanwendung=“archiMap”,Elementtyp=“Herstellerproduktversion”,Elementname=“Java SE JRE 8”,Date=DateTime.Parse(“1/1/2017”),Quantity=10},
新元素(),
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Apache Toimcat 8.0”,Date=DateTime.Parse(“6/1/2018”),Quantity=5},
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Oracle Java JDK 7”,Date=DateTime.Parse(“12/1/2018”),Quantity=5},
新元素(){Fachanwendung=“Event Management System”,Elementtyp=“Herstellerproduktversion”,Elementname=“Oracle Java JDK 8”,Date=DateTime.Parse(“1/1/2019”),Quantity=5}
};
Dictionary dict=elements.GroupBy(x=>x.Fachanwendung,y=>y)
.ToDictionary(x=>x.Key,y=>y.ToList());
DataTable dt=新的DataTable();
dt.Columns.Add(“Fachanwendung”,typeof(string));
添加(“Elementtyp”,typeof(string));
dt.Columns.Add(“Elementname