Hallo!
Ich weiss nicht, was genau Dir Probleme macht.
Hier ein kleines Beispiel-Formular.
Public Class frmDGVSum
Dim dt As New DataTable
Dim WithEvents bs As New BindingSource With {.DataSource = dt}
Dim WithEvents dgvDaten As New DataGridView With _
{.Parent = Me, .Dock = DockStyle.Top, .DataSource = bs, _
.AllowUserToAddRows = False}
Dim dgvSum As New DataGridView With {.Parent = Me, .Dock = _
DockStyle.Bottom, _
.ColumnHeadersVisible = False, .Height = 50, .ReadOnly = True, _
.AllowUserToAddRows = False}
Private Sub frmDGVSum_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.MinimumSize = New Size(300, 300)
'Kleines Datenbeispiel
With dt.Columns
.Add("Project ID", GetType(String))
.Add("Kosten_geplant", GetType(Decimal))
.Add("Kosten_abgerechnet", GetType(Decimal))
.Add("Dauer_Tage", GetType(UInteger))
End With
For i As Integer = 0 To 9
dt.Rows.Add("Projekt " & CStr(i + 1), 12330000 * i * 0.22, _
23456709 * i * 0.23, 24 + i * 2)
Next i
'Filter
bs.Filter = "Kosten_geplant > 10000000"
FillDgVSum()
frmDGVSum_Resize(Me, Nothing)
End Sub
Private Sub FillDgVSum()
With dgvSum
.Rows.Clear() : .Columns.Clear()
Dim sums(dgvDaten.Columns.Count - 1) As Object
For i As Integer = 0 To dt.Columns.Count - 1
.Columns.Add(dt.Columns(i).ColumnName, dt.Columns(i).ColumnName)
.Columns(.Columns.Count - 1).Width = dgvDaten.Columns(i).Width
Dim coltype As Type = dt.Columns(i).DataType
If coltype.IsValueType AndAlso _
(coltype.IsPrimitive Or coltype.Equals(GetType(Decimal))) Then
'Berechnung der Spaltensumme - nur gefilterte Datensätze
sums(i) = Aggregate r As Object In bs _
Into Sum(CDec(CType(r, DataRowView).Item(i)))
End If
Next i
'Summenspalte einfügen
.Rows.Add(sums) : .Refresh()
End With
End Sub
Private Sub frmDGVSum_Resize(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.ResizeEnd
dgvSum.Top = Me.Height - dgvSum.Height - 5
dgvDaten.Height = dgvSum.Top - 5
End Sub
Private Sub dgvDaten_CellEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles dgvDaten.CellEnter
'Das Summengrid folgt der Bewegung im Daten-Grid
If dgvSum.Rows.Count > 0 Then
dgvSum.CurrentCell = dgvSum(e.ColumnIndex, 0)
End If
End Sub
Private Sub dgvDaten_ColumnWidthChanged(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) _
Handles dgvDaten.ColumnWidthChanged
FillDgVSum()
End Sub
End Class
Beitrag wurde zuletzt am 17.11.11 um 16:17:10 editiert. |