Datagrid: вычислить среднюю или сумму для столбца в нижнем колонтитуле

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

На мой взгляд, я могу думать двумя способами:

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

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

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

2. « Bound for Glory»
Использование события 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.

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

Ответов (2)

Решение

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

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

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

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

Для справки, вот что я в итоге сделал: ( Предупреждение: 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), и в конечном итоге я искал волшебное решение.