Rubrik: Controls · sev-Controls | VB-Versionen: VB4, VB5, VB6 | 19.01.04 |
AutoSize für das sevDataGrid Optimale Spaltenbreite für das sevDataGrid einstellen | ||
Autor: Roland Wutzke | Bewertung: | Views: 14.926 |
www.vb-power.net | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Ohne Zweifel gehört das sevDataGrid durch seine enorme Flexibilität zu den besten Datagrids, die es für VB gibt. Doch genau wie bei den meisten anderen Grids fehlt auch hier die Möglichkeit, die Spalten auf die optimale Breite einzustellen.
Doch wie lässt sich das Realisieren? Um das zu bewerkstelligen, müssen ein paar Dinge berücksichtigt werden:
- Die Funktion muss so flexibel sein, dass es egal ist, wie viele Spalten und Zeilen das Grid gerade anzeigt.
- Die Spaltenheaders müssen ebenfalls berücksichtigt werden. Dabei ist zu beachten, ob die AutoSort Funktion und das Sort-Symbol aktiv ist. Auch ein evtl. vorhandenes Icon muss Beachtung finden.
- Der aktuelle Zeichensatz muss bei der Ermittlung der Breite berücksichtigt werden. Dazu wird die Funktion "TextWidth" aus der aufrufenden Form ausgeführt und der Font des Grids, der Form temporär zugewiesen.
- Die Funktion muss mit allen Modi (Recordset, List u. Random) des Grids laufen.
Hier die Routine. Fügen Sie den nachfolgenden Code in ein Modul ein:
Public Sub AutoColSevGrid(oForm As Form, oGrid As sevDataGrid.Grid, _ Optional WithColHeaders As Boolean = True) Dim xCol As Long Dim yRow As Long Dim xColValue() As Long Dim xColHeaderValue() As Long Dim AktColWidth As Long Dim OldFont As StdFont With oGrid ' Prüfen, ob es Zeilen und Spalten ' zum Einstellen gibt... If .Rows < 1 Or .Cols < 1 Then Exit Sub ' Eigenschaften der Form und Grid ' in Variablen retten Screen.MousePointer = 11 Set OldFont = New StdFont OldFont = oForm.Font Set oForm.Font = .Font ReDim xColValue(1 To .Cols) ReDim xColHeaderValue(1 To .Cols) .LockUpdate True ' Erst die Schriftbreite der ColHeaders ermitteln ' und in das Array übertragen If WithColHeaders Then For xCol = 1 To .Cols xColHeaderValue(xCol) = oForm.TextWidth(.Columns(xCol).Caption) If .AutoSort And .ShowSortSymbols Then _ xColHeaderValue(xCol) = xColHeaderValue(xCol) + 250 If .Columns(xCol).Image > 0 Then _ xColValue(xCol) = xColValue(xCol) + 250 Next xCol End If ' Jetzt die Schriftbreite der einzelnen Zellen ' ermitteln und in das Array übertragen. Dabei ' wird überprüft, ob die aktuelle Breite größer ' ist, als der bisher größte Wert im Array, und ' ggf. ins Array übertragen. For yRow = 1 To .Rows For xCol = 1 To .Cols AktColWidth = oForm.TextWidth(.Text(yRow, xCol)) If AktColWidth > xColValue(xCol) Then _ xColValue(xCol) = AktColWidth Next xCol Next yRow ' Jetzt die Spaltenbreite aus dem Array Einstellen For xCol = 1 To .Cols If xColHeaderValue(xCol) > xColValue(xCol) Then _ xColValue(xCol) = xColHeaderValue(xCol) .Columns(xCol).Width = xColValue(xCol) + 100 Next xCol ' Formparameter zurücksetzen Set oForm.Font = OldFont Set OldFont = Nothing Screen.MousePointer = 0 ' Grid neu zeichnen .LockUpdate False .Refresh End With End Sub
Aufrufbeispiel aus der Form, auf der sich Ihr Grid befindet:
' Spaltenheader berücksichtigen AutoColSevGrid Me, Grid1
Oder:
' Spaltenheader nicht berücksichtigen AutoColSevGrid Me, Grid1, False
Hinweis:
Entwickelt und getestet wurde die Funktion mit dem sevDataGrid v1.0.11.
Die Geschwindigkeit der Funktion ist Abhängig von der Anzahl der Spalten und Zeilen. Auf meinem Testrechner (Pentium IV, 1.4 GHz) benötigt eine Tabelle mit 15 Spalten und knapp 4000 Records ca. 3 Sekunden.
Die Funktion überprüft nicht, ob in den einzelnen Zellen ein Icon vorhanden ist. Ich habe aus Performance-Gründen bewusst darauf verzichtet.