데이터그리드:바닥글 열의 평균 또는 합계 계산
문제
데이터세트에 바인딩된 데이터그리드가 있고 정수로 채워진 열의 바닥글에 평균 결과를 표시하려고 합니다.
제가 생각하는 방법은 2가지입니다.
1."이용하세요. 원천, 루크"
DataGrid.DataBind()를 호출하는 코드에서 DataTable.Compute() 메서드(또는 제 경우에는 DataSet.DataTable(0).Compute()).예를 들어:
Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")
하지만 일단 이것을 갖고 나면 바닥글에 어떻게 삽입할 수 있습니까?
2."경계 영광을 위해"
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
이것은 잘못된 것 같습니다. 또한 모든 DataBind에서 runningTotal이 재설정되었는지 확인해야 합니다.
더 좋은 방법이 있나요?
해결책
둘 중 하나가 반드시 더 나은지는 모르겠지만 두 개가 더 좋습니다. 번갈아 하는 방법은 다음과 같습니다
- 바닥글을 누른 후 수동으로 표를 실행하고 화면의 텍스트에서 계산합니다.
- 수동으로 데이터를 검색하고 바인딩과 별도로 계산을 수행합니다.
물론 #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개)에 대해 이 작업을 수행해야 했고, 궁극적으로 내가 마법 같은 솔루션을 찾고 있었던 이유였습니다.