|
|
|
AutoSize für das sevDataGrid Optimale Spaltenbreite für das sevDataGrid v1.0 einstellen
|
Produktversionen: | sevDataGrid 1.0 |
VB-Versionen: | VB5/6 |
Autor: | Roland Wutzke |
Datum: | 19.01.04 |
Views: | 10268 |
|
|
|
  |
|
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.
Zurück zur Übersichtsseite
|