2008-08-13 3 views
5

У меня есть datagrid, связанный с набором данных, и я хочу отобразить средний результат в нижнем колонтитуле для столбца, заполненного целыми числами.Datagrid: Calculate Avg или Sum для столбца в нижнем колонтитуле

Путь я полагаю, что есть 2 способа я могу думать:

1. «Использование Источник, Люк»
В коде, где я звоню DataGrid.DataBind(), используйте Метод DataTable.Compute() (или в моем случае DataSet.DataTable (0) .Compute()). Например:

Dim strAverage = DataTable.Compute("Avg(ColumnName)", "") 

Но как только у меня есть это, как его можно вставить в нижний колонтитул?

2. «Bound для Славы»
Используя событие DataGrid.ItemDataBound, и вычисление нарастающего итога от каждого ListItemType.Item и ListItemType.AlternatingItem, наконец, показывать в ListItemType.Footer. Например:

Select Case e.Item.ItemType 
    Case ListItemType.Item, ListItemType.AlternatingItem 
     runningTotal += CInt(e.Item.Cells(2).Text) 
    Case ListItemType.Footer 
     e.Item.Cells(2).Text = runningTotal/DataGrid.Items.Count 
End Select 

Это просто неправильно, плюс я должен был бы убедиться, что runningTotal сбрасывается на каждый DataBind.

Есть ли лучший способ?

ответ

1

Я не знаю, как это всегда лучше, но два альтернативные способы бы:

  1. запустить вручную через таблицу, как только вы попали в подвал и вычислить из экранного текста
  2. вручную восстановить данные и сделать расчет отдельно от привязки

конечно, # 2 рода смещений преимущества связывания данных (при условии, что это то, что вы делаете).

1

спасибо DannySmurf, ваш первый ответ заставил меня увидеть смысл. (Почему мы всегда ищем это волшебное решение?).

Для справки, вот что я в конечном итоге делает: (Предупреждение: VB ниже, может не содержать достаточное количество точек с запятой)

Case ListItemType.Footer 
    e.Item.Cells(0).Text = "Average" 
    For i As Integer = 3 To 8 
     Dim runningTotal As Integer = 0 
     For Each row As DataGridItem In DataGrid.Items 
      If IsNumeric(row.Cells(i).Text) Then 
       runningTotal += CInt(row.Cells(i).Text) 
      End If 
     Next 
    e.Item.Cells(i).Text = Math.Round(runningTotal/DataGrid.Items.Count, 0) 
    Next 
End Select 

мне нужно сделать это для нескольких столбцов (отсюда 3 до 8), в конечном счете, почему я искал магическое решение.

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