2015-12-29 3 views
-3

Я динамически генерируемые DataTable с кучей различных значений:Преобразования значений ячеек из DataTable в Проценты

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

Я хочу показать данные каждого ячейки таким образом:

  • Каждого значение ячейки в столбец должен быть представлен как процентное значение общей суммы столбца.

Например, вместо 230 в первой ячейке Column1 в таблице выше, я хочу показать 23.00%. И он должен рассчитать следующим образом:

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() 
+0

Просто положить % перед ними! – dotctor

+0

значения могут быть большими числами и должны быть преобразованы в проценты, я просто использовал простые, чтобы держать вопрос простым. – BanTim

+0

Вопрос редактируется и его понятно, что ОП задает сейчас. Также он не заслуживает такого количества downvotes сейчас. –

ответ

3

Вы можете добавить вычисляемые столбцы в DataTable, установив Expression свойство DataColumn.

Затем вы можете отформатировать данные в DataGridView, используя DefaultCellStyle.Format свойство столбца.

Например предположим, у вас есть Table1, который содержит Column1, затем добавить вычисляемый столбец 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% 
+0

Это хороший пример, но я не могу добавить новый столбец. Мне нужно обновить существующий Datatable или создать новый Datatable. – BanTim

+1

Вы можете добавить столбец во время выполнения. Вам не нужно делать это во время разработки. –

+0

То, что я сделал точно. Спасибо за вашу помощь. Не уверен, как я могу отметить ваш комментарий в качестве ответа? – BanTim

Смежные вопросы