VB 5/6-Tipp 0554: ADO-Tabelle in Flexgrid abbilden
von Peter K. Sauer
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: | Verwendete API-Aufrufe: keine | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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