vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Datenbanken · DataSet/DataTable   |   VB-Versionen: VB2010 - VB201506.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 HerrmannBewertung:     [ Jetzt bewerten ]Views:  3.341 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein 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!

Dieser Tipp wurde bereits 3.341 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel