Tipp 0527 Große Datenmengen im MS(H)FlexGrid anzeigen
Autor/Einsender:
Datum:
  Lothar Kriegerow
14.02.2007
Entwicklungsumgebung:   VB 6
Oft ist es erforderlich, größere Datenmengen einer Datenbank in einer Tabelle anzuzeigen. Das MS(H)Flexgrid ist zwar sehr leistungsfähig, aber enthält z.B. ein Recordset mehr als ~31.000 Datensätze, ist eine Anzeige nicht mehr möglich, von der dem User zugemuteten Wartezeit während des Füllvorgangs einmal ganz abgesehen.
Professionelle Programme arbeiten daher mit einem kleinen Trick und zeigen immer nur so viele Daten an, wie sie auch der User auf dem Bildschirm überblicken kann. Hierzu stellt sogar das Grid die in der Praxis kaum beachtete Eigenschaft RowIsVisible zur Verfügung, mit der festgelegt und vor allem auch abgefragt werden kann, welche Zeile noch sichtbar ist.
Darauf baut dieses Beispiel auf, und so werden immer nur so viele Daten aus einem zuvor geladenem Recordset geholt und angezeigt, wie benötigt werden. Daher ist nicht nur eine sehr schnelle Anzeige der Daten gewährleistet, sondern auf diesem Weg können alle Datensätze eines Recordsets dem User zugänglich gemacht werden, auch wenn er mehrere hunderttausend Datensätze enthält.
 
Option Explicit

Dim CON As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim RecSeiten As Long
Dim SeitenGroesse As Long
Dim Start As Long

Sub Tabelle()
  Dim F As Integer

  With MSFlexGrid1
    .Top = 50
    .Left = 50
    .Row = 0
    .Cols = 5: .FixedCols = 0: F = -1

    F = F + 1: .ColWidth(F) = 700: .Col = F: .CellAlignment = 4
    .Text = "Nr"
    F = F + 1: .ColWidth(F) = 1800: .Col = F: .CellAlignment = 4
    .Text = "Name"
    F = F + 1: .ColWidth(F) = 1800: .Col = F: .CellAlignment = 4
    .Text = "Strasse"
    F = F + 1: .ColWidth(F) = 1700: .Col = F: .CellAlignment = 4
    .Text = "Ort"
    F = F + 1: .ColWidth(F) = 3000: .Col = F: .CellAlignment = 4
    .Text = "Name2"
  End With
End Sub

Private Sub Form_Load()
  Set CON = New ADODB.Connection
  Set Rs = New ADODB.Recordset

  CON.CursorLocation = adUseClient
  CON.Open "Provider=Microsoft.Jet.Oledb.4.0;Data Source=Demo.mdb"
  Rs.Open "Select * from Adressen", CON, adOpenStatic, _
        adLockOptimistic

  Start = 0
  VScroll1.ZOrder 0
  Tabelle
End Sub

Sub GridFuellen(StartRec As Long, NumRecords As Long)
  Dim X As Long, j As Integer

  With MSFlexGrid1
    If StartRec <= 1 Then StartRec = 1

    .Redraw = False
    .Rows = 1

    For X = StartRec To (StartRec + NumRecords - 1)
      If X <= Rs.RecordCount Then
         .Rows = .Rows + 1: .Row = .Rows - 1
         Rs.AbsolutePosition = X

         For j = 0 To Rs.Fields.Count - 1
           If Not IsNull(Rs(j)) Then
              .Col = j
              Select Case j
                 Case 0
                    .CellAlignment = 6
                 Case 1
                    .CellForeColor = RGB(140, 150, 250)
                 Case 3
                    .CellAlignment = 4
              End Select

              .Text = Rs(j)
            End If
         Next j
      Else
        Exit For
      End If
    Next X

    .Redraw = True
  End With
End Sub

Private Sub Form_Resize()
  If Me.Height < 1500 Then Exit Sub

  Dim X As Long
  With MSFlexGrid1
    .Height = Me.Height - 500
    .Width = Me.Width - 200
    .Rows = 400
    .TopRow = 1
    X = 1
    Do Until X = 400
      If .RowIsVisible(X) = False Then
        SeitenGroesse = X - 2
        Exit Do
      End If
      X = X + 1
    Loop

    .Rows = 1
    RecSeiten = (Rs.RecordCount / SeitenGroesse)
    VScroll1.Max = RecSeiten
    VScroll1.Min = 0
    GridFuellen Start, SeitenGroesse
    VScroll1.Top = .Top + 30
    VScroll1.Left = (.Width - VScroll1.Width) + 15
    .LeftCol = 0
    VScroll1.Height = .Height - 50
  End With
End Sub

Private Sub MSFlexGrid1_KeyUp(KeyCode As Integer, Shift As Integer)
  If KeyCode = 33 And VScroll1.Value > 0 Then _
        VScroll1.Value = VScroll1.Value - 1
  If KeyCode = 34 And VScroll1.Value < VScroll1.Max Then _
        VScroll1.Value = VScroll1.Value + 1
End Sub

Private Sub VScroll1_Change()
  If VScroll1.Value = 0 Then Start = 1

  If VScroll1.Value * SeitenGroesse >= Start Then
    Start = VScroll1.Value * SeitenGroesse + 1
  Else
    Start = VScroll1.Value * SeitenGroesse + 1
  End If

  If Start < 1 Then Start = 1
  GridFuellen Start, SeitenGroesse
End Sub
 
Hinweis
Um diesen Tipp ausführen zu können, muss ein Verweis auf die Microsoft ActiveX Data Objects 2.x Library in das Projekt eingebunden werden.

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (17,2 kB) Downloads bisher: [ 405 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Montag, 28. März 2011