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

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

Как я понимаю, есть два способа, о которых я могу думать:

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 сбрасывается при каждой привязке данных.

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

13.08.2008 02:15:17
2 ОТВЕТА
РЕШЕНИЕ

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

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

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

1
13.08.2008 02:59:55

Спасибо 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), в конечном счете, поэтому я искал волшебное решение.

1
23.05.2017 12:19:33