Rubrik: Controls · MSFlexGrid/DataGrid | VB-Versionen: VB4, VB5, VB6 | 28.02.05 |
Flexgrid: optimale Spaltenbreite setzen Dieser Code ermittelt die optimale Spaltenbreiten im FlexGrid-Control. | ||
Autor: Hermann Röttger | Bewertung: | Views: 18.213 |
www.direct-solutions-software.com | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Das Flexgrid-Control trägt seinen Namen nicht zu unrecht, ist es doch eines der flexibelsten Steuerelemente, die Visual Basic bietet. Was allerdings fehlt, ist eine "Autosize" - Eigenschaft, mit der die Breite jeder Spalte optimal festgelegt wird. Für dieses Problem gibt es eine sehr einfache Lösung, die ich euch heute präsentieren will.
Hier das "Rezept":
Man nehme ein Label mit aktivierter Autosize-Eigenschaft, dessen Font-Eigenschaften mit dem Flexgrid übereinstimmen, kopiert alle Einträge des Flexgrids nacheinander hinein und bekommt so die jeweilige optimale Spaltenbreite.
Soviel zur Theorie. Kopiert den nachfolgenden Code einfach in ein Formular mit einem Flexgrid und einem Label:
Private Sub Form_Load() ' Flexgrid zu Demonstrationszwecken mit Zeichenketten ' von zufälliger Länge füllen... Dim Zufall As Long Dim x As Long Dim y As Long With MSFlexGrid1 .FixedCols = 0 .FixedRows = 1 .Rows = 15 .Cols = 5 For y = 0 To .Rows - 1 For x = 0 To .Cols - 1 Zufall = Int((20 + 1) * Rnd + 3) .TextMatrix(y, x) = String(Zufall, "X") Next x Next y End With ' Funktions-Aufruf per SpaltenBreite ' [Name des Flexgrids], [Name des Labels] SpaltenBreite MSFlexGrid1, Label1 End Sub
Sub SpaltenBreite(FlexGrid As MSFlexGrid, SizeLbl As Label) Dim Spalte As Long Dim Zeile As Integer Dim Breite As Double With FlexGrid ' Font-Eigenschaften des Flexgrids auf Label ' übertragen SizeLbl.Font = .Font SizeLbl.FontSize = .Font.Size SizeLbl.FontItalic = .Font.Italic SizeLbl.FontBold = .Font.Bold ' Autosize des Labels aktivieren und Label ' ausblenden SizeLbl.AutoSize = True SizeLbl.Visible = False ' Aktualisierung des Flexgrids verhindern, bis ' Vorgang abgeschlossen ist .Redraw = False ' Flexgrid spaltenweise "abtasten"... For Spalte = 0 To .Cols - 1 ' ermittelte Höchstbreite vor jedem ' Spaltendurchlauf zurücksetzen Breite = 0 ' Alle Zeilen der aktuellen Spalte durchlaufen... For Zeile = 0 To .Rows - 1 ' Inhalt der aktuellen Zelle in Label schreiben... SizeLbl.Caption = .TextMatrix(Zeile, Spalte) ' Ist die aktuelle Breite des Labels größer als die ' bisher ermittelte höchste Breite ? If SizeLbl.Width > Breite Then ' Ja, dann Breite in VAR Breite ablegen Breite = SizeLbl.Width End If Next Zeile ' Wenn alle Zeilen der aktuellen Spalte durchlaufen sind, ' ermittelte höchste Spaltenbreite als optimale Spaltenbreite ' der aktuellen Zeile des Flexgrids setzen .ColWidth(Spalte) = Breite Next Spalte ' Aktualiaierung des Flexgrids wieder zulassen .Redraw = True End With End Sub
Ok, das war's schon. Ich hoffe, dass euch dieser Tipp eure tägliche Arbeit etwas erleichtern kann.