vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · MSFlexGrid/DataGrid   |   VB-Versionen: VB603.09.02
Zellenhöhe in MSHFlexgrid anpassen

Eine Funktion, die automatisch die notwendige Zellenhöhe im MSHFlexgrid bei WordWrap berechnet.

Autor:   Michael BeckerBewertung:     [ Jetzt bewerten ]Views:  19.160 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Manche Datenbankfelder beinhalten Memos, die eine unbestimmte Anzahl an Buchstaben besitzen. Lädt man solch ein DB-Feld in ein MSHFlexGrid, dann wird bei aktivem WORD-WRAP zwar der Text umgebrochen, aber die Zeilenhöhe bleibt bestehen (man sieht nur die erste Zeile)

Stellt man nun die RowHeight-Eigenschaft auf einen festen Wert, dann bringt das nicht sehr viel !!!

Man kann zwar AllowUserResizing auf 2 (Zeilen) stellen, dies hat nur den Nachteil, dass der Benutzer viel hin und herschieben muß, um beispielsweise einen Text zu suchen!

Hier die Abhilfe ....

Wir benötigen:

  1. Form1
  2. 1 x das MSHFLEXGRID1 (Komponente --> Hierachical Flex Grid)
  3. und Text

Hier die Funktion:

Public Function MSH_CELLHOEHE( _
  ByVal Textbaustein As String, _
  Buchstaben As Integer, _
  Cellhoehe As Integer) As Long
 
  Dim zz As Long
 
  zz = Len(Textbaustein)
  If zz > Buchstaben Then
    zz = Int(Len(Textbaustein) / Buchstaben) + 1
    MSH_CELLHOEHE = Cellhoehe * zz
  Else
    MSH_CELLHOEHE = Cellhoehe
  End If
End Function

Beschreibung der Funktion:

Die Funktion benötigt:

  • Textbaustein (dies ist der Text der in dem MSHFlexgrid erscheint)
  • Buchstaben (dies ist die Anzahl der Buchstaben, die nebeneinander in eine Zeile passen)
  • Cellhoehe (die Standard-Zellhöhe wenn nur eine Zeile existiert)
Der Rückgabewert der Funktion besteht aus dem neuen RowHeight-Wert.

Aufruf der Funktion:

' Im nachfolgenden Beispiel werden eine ID und 4 
' Textfelder (MEMO) aus der Datenbank geladen.
' Das Flexgrid hat 5 Cols. Die Cellheight setze ich
' mit 285 und die Anzahl aller Buchstaben die in
' eine Zelle nebeneinander passen setze ich auf 33 
' (entspricht in etwa eine Colwidth von 2700)
 
Public Sub MSHFLEXGRID1_FUELLEN()
  Dim rs As New ADODB.Recordset
  Dim ff as integer   ' Rowzaehler
  Dim zellmax as long ' Prüft, welche Row die höchste Cell hat
 
  ff = 1
 
  ' Recordset erstellen
  rs.Open "SELECT ID, Text1, Text2, Text3, Text4 " & _
    " FROM tblIrgendeineTabelle ORDER BY ID", _
    adocn, adOpenForwardOnly, adLockReadOnly
 
  If rs.State = adStateOpen Then
    Do Until rs.EOF
      With Form1.MSHFlexGrid1
        .Rows = ff + 1
        .Row = ff
        .Col = 0: .Text = rs(0)      ' ID
 
        .Col = 1: .Text = nz(rs(1))  ' TEXT 1
        .RowHeight(ff) = MSH_CELLHOEHE(nz(rs(1)), 33, 285)
        zellmax = MSH_CELLHOEHE(nz(rs(1)), 33, 285)
 
        .Col = 2: .Text = nz(rs(2))  ' TEXT 2
        If MSH_CELLHOEHE(nz(rs(2)), 33, 285) >= zellmax Then
          zellmax = MSH_CELLHOEHE(nz(rs(2)), 33, 285)
          .RowHeight(ff) = MSH_CELLHOEHE(nz(rs(2)), 33, 285)
        End If
 
        .Col = 3: .Text = nz(rs(3))  ' TEXT 3
        If MSH_CELLHOEHE(nz(rs(3)), 33, 285) >= zellmax Then
          zellmax = MSH_CELLHOEHE(nz(rs(3)), 33, 285)
          .RowHeight(ff) = MSH_CELLHOEHE(nz(rs(3)), 33, 285)
        End If
 
        .Col = 4: .Text = nz(rs(4))  ' TEXT 4
        If MSH_CELLHOEHE(nz(rs(4)), 33, 285) >= zellmax Then
          zellmax = MSH_CELLHOEHE(nz(rs(4)), 33, 285)
          .RowHeight(ff) = MSH_CELLHOEHE(nz(rs(4)), 33, 285)
        End If
        zellmax = 0
        ff = ff + 1
        rs.MoveNext
      End With
    Loop
  End If
  rs.Close
  Set rs = Nothing
End Sub
Private Function nz(ByVal vValue As Variant) As Variant
  ' Prüft, ob ein Feld den Wert NULL hat, 
  ' um so den unliebsamen Fehler 94 zu vermeiden
  If IsNull(vValue) Then
    nz = ""
  Else
    nz = vValue
  End If
End Function