【问题标题】:How do I Add Sum of DataGridView Rows of Same Date as New "Total" rows at the end of rows of same date?如何在相同日期的行末尾添加相同日期的 DataGridView 行的总和作为新的“总计”行?
【发布时间】:2020-09-17 03:21:43
【问题描述】:

我有一个 DataGridView 来显示来自 DataTable“dtGrid”的数据。 dtGrid 有“MyDate”和“Amount”两列,行是这样的,

dtGrid.Rows.Add(new object[] { "2020-09-14", 100 });
dtGrid.Rows.Add(new object[] { "2020-09-14", 150 });
dtGrid.Rows.Add(new object[] { "2020-09-14", 110 });
dtGrid.Rows.Add(new object[] { "2020-09-16", 200 });
dtGrid.Rows.Add(new object[] { "2020-09-16", 170 });

现在,我需要将 DataGridView 填充为

2020-09-14 |100
2020-09-14 |150
2020-09-14 |110
Total|360
2020-09-16 |200
2020-09-16 |170
Total|370

我试图在循环中检查 dtGrid 的下一行日期,例如,

for (int i = 0; i < dtGrid.Rows.Count; i++)
        {
            if (i + 1 < dtGrid.Rows.Count && dtGrid.Rows[i][0] != dtGrid.Rows[i + 1][0])
            {
                GridReport.Rows.Add(dtGrid.Rows[i][0], dtGrid.Rows[i][1]);
                var dtFiltered = dtGrid.AsEnumerable()
                        .Where(x => x.Field<DateTime>("MyDate").ToString().Equals(dtGrid.Rows[i][0].ToString()))
                        .CopyToDataTable();
                var Total = dtFiltered.AsEnumerable()
                         .Sum(x => x.Field<double>("Amount"));

                GridReport.Rows.Add("Total:", Total);
            }
            else if(i + 1 < dtGrid.Rows.Count && dtGrid.Rows[i][0] == dtGrid.Rows[i + 1][0])
            {
                GridReport.Rows.Add(dtGrid.Rows[i][0], dtGrid.Rows[i][1]);
            }
            else if (i + 1 == dtGrid.Rows.Count)
            {
                GridReport.Rows.Add(dtGrid.Rows[i][0], dtGrid.Rows[i][1]);
                var dtFiltered = dtGrid.AsEnumerable()
                        .Where(x => x.Field<DateTime>("MyDate").ToString().Equals(dtGrid.Rows[i][0].ToString()))
                        .CopyToDataTable();
                var Total = dtFiltered.AsEnumerable()
                         .Sum(x => x.Field<double>("Amount"));

                GridReport.Rows.Add("Total:", Total);
            }
        }

它只是不起作用。任何建议将不胜感激。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    尝试以下解决方案

    dtGrid = new DataTable();
    dtGrid.Columns.Add("MyDate", typeof(string));
    dtGrid.Columns.Add("Amount", typeof(decimal));
    
    dtGrid.Rows.Add(new object[] { "2020-09-14", 100 });
    dtGrid.Rows.Add(new object[] { "2020-09-14", 150 });
    dtGrid.Rows.Add(new object[] { "2020-09-14", 110 });
    dtGrid.Rows.Add(new object[] { "2020-09-16", 200 });
    dtGrid.Rows.Add(new object[] { "2020-09-16", 170 });
    
    var rows = dtGrid.AsEnumerable()
        .GroupBy(row => row.Field<string>("MyDate"), row => row.Field<decimal>("Amount"))
        .Select(g => new { Date = g.Key, Amounts = string.Join(", ", g), Total = g.Sum() });
    
    var dt = new DataTable();
    dt.Columns.Add("Date", typeof(string));
    dt.Columns.Add("Amounts", typeof(string));
    dt.Columns.Add("Total", typeof(decimal));
    
    foreach (var row in rows)
        dt.Rows.Add(row.Date, row.Amounts, row.Total);
    
    GridReport.DataSource = dt;
    

    它会给出以下结果

    Date       | Amounts       | Total
    2020-09-14 | 100, 150, 110 | 360
    2020-04-16 | 200, 170      | 370
    

    【讨论】:

    • MyDate 的类型错误。结果Amounts debatable 的类型(假设您在该日期有数百个值)。我可以建议两个在 DateTime 列上有关系的数据表吗?所以,一个主视图加辅助视图。
    • @Jimi - 我复制了作者的数据。虽然他写道MyDateDateTime 类型,但在代码中它是string。但无论如何,都无所谓,很容易改变。
    • .Where(x =&gt; x.Field&lt;DateTime&gt;("MyDate").ToString()。转换为字符串。但是你有义务听我说:)
    • @Jimi - 我同意这是一个可疑的决定。我也会查看主/详细视图。
    • @AlexanderPetrov - Master/Detail 模型正在使用中,但在此特定报告中,DateTotal 需要作为row 在该Date 的最后一个条目下方。跨度>
    【解决方案2】:

    试试这个,创建您创建的逻辑的简短版本

    var total = 0;
    for (var i = 0; i < dtGrid.Rows.Count; i++)
    {
       if (i == 0)
       {
          //Cells[1] will get amount
          total = Convert.ToInt32(dtGrid.Rows[i].Cells[1].Value);
       } //Cells[0] will get date
       else if (dtGrid.Rows[i - 1].Cells[0].Value == dtGrid.Rows[i].Cells[0].Value)
       {
          total = total + Convert.ToInt32(dtGrid.Rows[i].Cells[1].Value);
       }
       else
       {
          dtGrid.Rows.Insert(i, "Total : ", total);
          //resets total value
          total = 0;
          //will add index position where total is inserted
          i = i + 1;
       }
    }
    

    【讨论】:

    • 稍作修改后,现在可以使用了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2019-05-07
    • 2022-09-30
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多