Domanda

Ho una griglia di dati che viene associata a un set di dati e desidero visualizzare il risultato medio nel piè di pagina per una colonna popolata con numeri interi.

Per come la vedo io, ci sono 2 modi in cui posso pensare:

1."Utilizzare il Fonte, Luca"
Nel codice in cui chiamo DataGrid.DataBind(), utilizza il metodo DataTable.Compute() (o nel mio caso DataSet.DataTable(0).Compute()).Per esempio:

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

Ma una volta ottenuto questo, come posso inserirlo nel footer?

2."Limite per la gloria"
Utilizzando l'evento DataGrid.ItemDataBound e calcolando un totale parziale da ogni ListItemType.Item e ListItemType.AlternatingItem, infine visualizzandolo in ListItemType.Footer.Per esempio:

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

Sembra semplicemente sbagliato, inoltre dovrei assicurarmi che runningTotal venga ripristinato su ogni DataBind.

C'è un modo migliore?

È stato utile?

Soluzione

Non so se uno dei due sia necessariamente migliore, ma due alternato i modi sarebbero:

  1. Scorri manualmente la tabella una volta raggiunto il piè di pagina e calcola dal testo sullo schermo
  2. Recupera manualmente i dati ed esegui il calcolo separatamente dal collegamento

Naturalmente, il numero 2 compensa in qualche modo i vantaggi dell'associazione dati (supponendo che sia quello che stai facendo).

Altri suggerimenti

Grazie Danny Puffo, la tua prima risposta mi ha fatto capire.(Perché cerchiamo sempre quella soluzione magica?).

Per riferimento, ecco cosa ho finito per fare:(Avvertimento:VB di seguito potrebbe non contenere abbastanza punti e virgola)

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

Avevo bisogno di farlo per diverse colonne (quindi da 3 a 8), ecco perché cercavo la soluzione magica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top