【问题标题】:Convert Cell Values of DataTable to Percentages将 DataTable 的单元格值转换为百分比
【发布时间】:2015-12-29 22:19:34
【问题描述】:

我有一个动态生成的 DataTable 有一堆不同的值:

Column1 | Column2  | Column3
----------------------------
230     | 265      | 272    
270     | 235      | 235    
250     | 235      | 254    
250     | 225      | 259    

我想以这种方式显示每个单元格的数据:

  • 列中的每个单元格值应表示为列总数的百分比值。

例如,我想显示23.00%,而不是上表中Column1 的第一个单元格中的230。它应该这样计算:

First Cell of Column 1: 23.00% = (230 / (230 + 270 + 250 + 250)) * 100 

例如,对于上表,结果应该是:

Column1  | Column2  | Column3
-----------------------------
23.00%   | 27.60%   | 26.67%  
27.00%   | 24.48%   | 23.04%
25.00%   | 24.48%   | 24.90%
25.00%   | 23.44%   | 25.39%

这是我使用的解决方案。 dtTab.Columns.Add("TotalQty", GetType(Double))

    Dim results As IEnumerable(Of Tuple(Of Object, Double)) = dtTab.Rows _
            .Cast(Of DataRow) _
            .GroupBy(Function(s As DataRow) s.Item("DateLabel")) _
            .SelectMany(Function(rows) rows.Select(Function(row) Tuple.Create(row.Item("Date"), Convert.ToDouble(rows.Sum(Function(dataRow) Convert.ToDouble(dataRow.Item("QTY")))))))

    For Each result As Tuple(Of Object, Double) In results
        Dim dRow As DataRow() = dtTab.Select(String.Format("Date ='{0}' ", result.Item1.ToString()))
        For Each row As DataRow In dRow
            row.SetField(Of System.Nullable(Of Double))("TotalQty", result.Item2)
        Next
    Next

    For Each row As DataRow In dtTab.Rows
        Dim total As Double = row.Item("TotalQty")
        total = Math.Round(total, 1)
        row.SetField(Of System.Nullable(Of Double))("QTY", Convert.ToDouble(row.Item("QTY")) / total * 100)
    Next

    dtTab.Columns.Remove("TotalQty")
    dtTab.AcceptChanges()

【问题讨论】:

  • 在他们面前放一个 % 符号!
  • 值可以是大数字,需要转换成百分比,我只是用简单的来保持问题简单..
  • 问题已被编辑,并且很清楚 OP 现在在问什么。现在也不值得这么多的反对票。

标签: c# .net winforms datagridview datatable


【解决方案1】:

您可以通过设置DataColumnExpression 属性将计算列添加到您的DataTable

然后您可以使用列的DefaultCellStyle.Format 属性格式化DataGridView 中的数据。

例如,假设您有一个包含Column1Table1,那么要添加一个计算列Column1Percent,您可以这样做:

table1.Columns.Add("Column1Percent", double);
table1.Columns["Column1Percent"].Expression = "(Column1/SUM(Column1)) * 100";
this.DataGridView1.Columns["Column1Percent"].DefaultCellStyle.Format = "0.00'%'";

然后结果是:

Column1 | Column1Percent
------------------------
1       | 20.00%
2       | 40.00%
2       | 40.00%

【讨论】:

  • 这是一个很好的例子,但我无法添加新列。我需要更新现有的数据表或创建一个新的数据表。
  • 您可以在运行时添加列。您不需要在设计时这样做。
  • 这正是我所做的。感谢您的帮助。不确定如何将您的评论标记为答案?
  • 不客气 :) 单击答案附近的复选标记将其标记为已接受就足够了。 :) Here 你可以找到更多关于接受答案的信息。
猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多