Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0554: ADO-Tabelle in Flexgrid abbilden

 von 

Beschreibung 

Oft ist es sinnvoll, Daten, die aus einer Datenbank stammen in einer Tabelle anzuzeigen. In diesem Beispiel wird eine Komplette Tabelle mit Spaltenköpfen und Zeilennummern in einem FlexGrid abgebildet.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [3,01 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
' Es muss ein Verweis auf 'Microsoft ADO Ext. 2.7 for DDL and Security' gesetzt werden.
' Es muss ein Verweis auf 'Microsoft ActiveX Data Objects 2.0 Library' gesetzt werden.
' Die Komponente 'Microsoft FlexGrid Control 6.0 (MSFLXGRD.OCX)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Flexible Tabelle "MSFlexGrid1"

Option Explicit
 
Private CnA As ADODB.Connection
 
Private Sub Form_Load()
 
   Dim strPathToDB As String
   
      'Flexgrid nicht sichtbar
      MSFlexGrid1.Visible = False
   
      'Fehlerbehandlung
      On Error Goto Abbruch
   
      'Datenbank bestimmen
      strPathToDB = "nordwind.mdb"
 
      'Connection zur Datenbank
      Set CnA = New ADODB.Connection
      
      With CnA
         .CursorLocation = adUseClient
         .Mode = adModeShareDenyNone
         .Provider = "Microsoft.Jet.OLEDB.4.0"
         .ConnectionString = strPathToDB
         .Open
      End With
      
      Err.Clear
      Exit Sub
      
Abbruch:
      MsgBox "Fehler: " & Err.Number & vbCrLf & _
             Err.Description, vbCritical
      Err.Clear
End Sub
 
Private Sub Command1_Click()
 
   Dim RsA As ADODB.Recordset
   Dim Table As String
   Dim sSQL As String
   
      If CnA.State = adStateClosed Then
         MsgBox "keine Connection zur Datenbank", _
                vbCritical
         Exit Sub
      End If
      
      'Fehlerbehandlung
      On Error Goto Abbruch
      
      Set RsA = New ADODB.Recordset
      
      'Tabelle bestimmen
      Table = "Artikel"
      
      'Recordset laden
      sSQL = "Select * From " & Table
      With RsA
         .CursorType = adOpenKeyset
         .LockType = adLockReadOnly
         .ActiveConnection = CnA
         .Open sSQL
      End With
   
      'anzeigen in Flexgrid
      FlexFillFromRs RsA, MSFlexGrid1
      
      MSFlexGrid1.Visible = True
      
      'Recordset schliessen, Speicher freigeben
      RsA.Close
      Set RsA = Nothing
      Err.Clear
      Exit Sub
      
Abbruch:
      MsgBox "Fehler: " & Err.Number & vbCrLf & _
             Err.Description, vbCritical
      Err.Clear
End Sub
 
 
Public Function FlexFillFromRs(Rs As ADODB.Recordset, _
                               Flex As MSFlexGrid)
'Inhalt Recordset in einem Flexgrid darstellen
   Dim i As Long
   Dim j As Long
   Dim breit As Single
      
      With Flex
         'neuzeichnen unterdrücken
         .Redraw = False
         .AllowBigSelection = True
         .AllowUserResizing = flexResizeBoth
         .Appearance = flex3D
         .FocusRect = flexFocusNone
         .FixedRows = 1
         .FixedCols = 1
         'Anzahl Spalten festlegen
         .Cols = Rs.Fields.Count
         'Header beschriften
         For i = 0 To Rs.Fields.Count - 1
            .TextMatrix(0, i) = Rs.Fields(i).Name
         Next
         'Anzahl der Zeilen festlegen
         .Rows = .FixedRows + Rs.RecordCount + 1
                                                      
         'Flex mit Daten füllen
         Do While Not Rs.EOF
            'RecordNummer = Nummer Zeile/Row
           i = Rs.AbsolutePosition
            For j = 0 To Rs.Fields.Count - 1
               'Abfrage auf NULL
               If Not IsNull(Rs.Fields(j).Value) Then
                  .TextMatrix(i, j) = Rs.Fields(j).Value
               End If
            Next
            Rs.MoveNext
         Loop
         
         'Spaltenbreite optimieren
         For i = 0 To .Cols - 1
            breit = 0
            For j = 0 To .Rows - 1
               If Me.TextWidth(.TextMatrix(j, i)) > breit Then
                  breit = Me.TextWidth(.TextMatrix(j, i))
               End If
            Next
            .ColWidth(i) = breit + 120
         Next
         'Flex (endgültig) Neu zeichnen
         .Redraw = True
      End With
End Function
 
Private Sub Form_Unload(Cancel As Integer)
 
      'Connection schliessen, Speicher freigeben
      If CnA.State = adStateOpen Then
         CnA.Close
      End If
      Set CnA = Nothing
End Sub


'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Rotax42 am 08.12.2011 um 12:28

Ein sehr schönes Beispiel, Danke schön!
Ich habe das Unterprogramm FlexFillFromRs übernomen allerdings fülle ich die Zellen aus Arrays und nicht aus dem Recordset.

Kommentar von Frank Spreer am 30.03.2008 um 19:58

'anzeigen in Flexgrid
FlexFillFromRs RsA, MSFlexGrid1

bringt
Argumenttyp ByRef unverträglich
auf MSFlexGrid1

?

Kommentar von Flou am 05.09.2006 um 18:46

Hm, toll toll!

Aber wie sieht das ganze in VB.NET 2002 aus?
Les ma ne Datenbanktabelle mit 40 Feldern
und 114000 Datensätzen ein. Dauert ewig.
es gibt in VB6 die Möglichkeit zu sagen: (auf dieses Beispiel bezogen)
Set Flex.DataSource = RS
Dadurch ersparst du dir das manuelle befüllen und es geht VIEL schneller.
In VB.NET 2002 klappt das allerdings net mehr.
Ne Idee? Ich net!

Kommentar von Strack am 06.10.2005 um 15:01

Ich habe VB Version 4.00 professional.
DAO funktioniert, wenn ich den ADO Verweis (2.5) msado15.dll einbinde, wird das Programm (Zugriff auf Oracle) korrekt ausgeführt.
Wenn ich aber versuche, eine .EXE zu erstellen, bricht VB32 ab (hat Fehler verursacht .....)

Kommentar von pks am 04.10.2004 um 17:36

kleine Verbesserung: Me.TextWidth ersetzen durch Flex.Parent.TextWidth, dadurch kann die Prozedur in jedem beliebigen Module plaziert werden

Kommentar von Henning am 09.01.2003 um 13:57

Hallo,
der Tipp funktioniert gut. 2 Fragen: Warum diese umständliche Befüllung des Flexgrids mit TextMatrix? Kann man nicht vile einfacher ein MSHFlexgrid nehmen und und die DataSource-Eigenschaft auf das Recordset setzen?
Ansonsten wüsste ich auch gern, wie ich die Daten editieren kann (vgl. Markus)
Gruß, Henning

Kommentar von René am 24.12.2002 um 08:38

Hallo Peter,
Das Beispiel konnte ich bereits testen und es klappt wunderbar. Habe änliches auch schon probiert, hatte aber bis jetzt keinen Erfolg.
Danke René

Kommentar von Markus am 18.12.2002 um 15:50

Hallo,

Konnte das schon testen und es funktioniert wunderbar. Habe jetzt aber ein anderes Problem. Wenn ich nun die Daten in meinen Flexgrid habe, würde ich sie gerne auch ändern. Weiß aber nicht wie ich an die Sache rangehen soll. Gibts hierzu auch ein Tutorial oder eine gute Hilfe. Habe leider noch nichts gefunden.
DANKE

Kommentar von Willi am 16.12.2002 um 22:44

Hallo Peter,
find ich einfach super, aber konnte noch nicht testen, da mir die Zeit bisher fehlt. Komme aber über die Feiertage gewiss dazu.
Willi Wissing Münster
www.wiwim.de