Rubrik: Datenbanken · DataSet/DataTable | VB-Versionen: VB2010 - VB2015 | 06.04.21 |
Umfangreiche Datentabellen mit DatagridView anzeigen Es wird eine Methode gezeigt, die es erlaubt, große Datentabellen im Datagridview anzuzeigen mit vertretbarem Zeitaufwand. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 2.996 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wenn eine Datentabelle viele Sätze (möglicherweise tausende Datensätze) enthält, wird es schwierig, sie im datengebundenen DatagridView (DGV) anzuzeigen. Virtualmode scheidet wegen der Datengebundenheit aus. Wenn man dann noch die Eigenschaft DGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells anwenden möchte, wird es noch schwieriger. Ich löse das folgendermaßen; das soll aber nur eine Anregung für weitere Ideen sein:
Voraussetzung sind eine Datentabelle (eventuell SQL), eine Form mit DGV, ein BindingNavigator-Control, ein BindingSource-Komponente und ein bisschen Code.
Zunächst auf der Form das DGV (dgTabelle als SQL-Tabelle) und BindingNavigator (Navigator1) platzieren, BindingSource (bsTabelle) der Form hinzufügen.
Prinzip der Datenorganisation ist: Die Datentabelle in ein Dataset füllen, die DataSource von bsTabelle als die Datentabelle festlegen, die DataSource des dgTabelle als auch die DataSource de Navigators mit bsTabelle definieren. Definieren von rowConst als eine Konstante, die die anzuzeigende Satzanzahl im DGV vorgibt.
In die SELECT-Anweisung der Datentabelle füge ich ein:
RANK() OVER (ORDER BY idfeld) As rowNum
Wobei idfeld ein beliebiges, sortierfähiges Feld der Datentabelle ist. Mittels diesem SELECT wird die Datentabelle ins DataSet gefüllt. Danach die DataSourcen wie oben beschrieben festlegen. Die wichtigste, zu vereinbarende Variable ist rowConst, die die anzuzeigende Anzahl von Datensätzen wiedergibt. Zwei Variable firstRow und lastRow sind die beiden Integer-Variablen, die in der Folge stets berechnet werden für die Filterung von bsTabelle nach rowNum mittels bsTabelle.Filter = "rowNum >= " & firstRow & " AND rowNum <= " & lastRow. Wie diese zwei Variablen berechnet werden, zeige ich unten.
Der Navigator1 wird folgendermaßen benutzt:
Ich zeige im Control nur die vier Buttons für das Bewegen in der DataSource an, also nächster, vorhergehender, letzter und erster Satz (meine eigenen Namen für die Buttons siehe unten).
Diese Buttons versorge ich mit ihrem Code während FormLoad
AddHandler nextG.Click, AddressOf nextGC AddHandler prevG.Click, AddressOf prevGC AddHandler toEnd.Click, AddressOf toEndC AddHandler toTop.Click, AddressOf toTopC
und mit den zugehörigen Prozeduren
Private Sub nextGC(sender As Object, e As EventArgs) ' nächste Gruppe firstRow += rowConst lastRow = firstRow + rowConst - 1 changeDatagridData() nextG.Enabled = (lastRow < anzRows) toEnd.Enabled = (lastRow < anzRows) End Sub
Private Sub prevGC(sender As Object, e As EventArgs) ' vorherige Gruppe firstRow -= rowConst : lastRow -= rowConst changeDatagridData() prevG.Enabled = (firstRow <> 1) toTop.Enabled = (firstRow <> 1) End Sub
Private Sub toEndC() 'zum letzten Satz der Gruppe firstRow = diff * rowConst lastRow = firstRow + rowConst changeDatagridData() End Sub
Private Sub toTopC() 'zum ersten Satz der Gruppe firstRow = 1 lastRow = rowConst changeDatagridData() End Sub
Die Prozedur changeDatagridData realisiert das Aktualisieren der anzuzeigenden Datensätze gemäß Filter des bsTabelle:
Private Sub changeDatagridData() With bsTabelle .DataSource = Nothing .DataSource = ds.Tables(myTableName) .Filter = "rowNum >= " & firstRow & " AND rowNum <= " & lastRow .ResetBindings(False) End With End Sub
Noch zu bemerken wäre, dass man die Eigenschaften des DGV vor changeDatagridData auf
dgTabelle.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None dgTabelle.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
setzt.
Erst wenn der Filter angewendet wurde kann man sie auf
dgTabelle.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells dgTabelle.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
setzen.
Viel Erfolg mit dieser Methode!