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

StackOverflow https://stackoverflow.com/questions/9409

Вопрос

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

Насколько я понимаю, есть 2 способа, которые я могу придумать:

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top