vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2014
 
zurück
Rubrik: Controls · MSFlexGrid/DataGrid   |   VB-Versionen: VB610.10.01
FlexGrid - Spaltenbreiten autom. festlegen

F?llt ein FlexGrid Control mit dem Inhalt einer Textdatei und legt automatisch die Spalten und Spaltenbreiten fest.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  17.072 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8 Beispielprojekt auf CD 

Unser gestriger Tipp hat gezeigt, wie sich ein FlexGrid Control automatisiert mit dem Inhalt einer Ascii-Textdatei füllen lässt, wobei alle benötigten Spalten automatisch erstellt wurden.

Siehe hierzu auch:  FlexGrid mit dem Inhalt einer Textdatei füllen

Jetzt könnte man natürlich das ganze noch steigern. Wie wäre es denn, wenn nicht nur die Anzahl der Spalten automatisch ermittelt werden, sondern auch gleich noch die Spaltenbreite automatisch festgelegt wird? Bisher hatten ja alle Spalten immer die gleiche Breite.

Die nachfolgende Prozedur ersetzt die Prozedur aus dem vorigen Tipp (s.o.), und zwar lässt sich als zusätzlicher Parameter angeben, ob:

  • die optimale Spaltenbreite eingestellt werden soll (d.h. die einzelnen Spalten sind immer so breit, dass auch der längste Eintrag innerhalb einer Spalte noch vollständig angezeigt wird)
  • oder ob die einzelnen Spalten prozentual an die aktuelle Anzeigebreite des Flexgrids angepasst werden sollen

Hier die modifizierte Routine
(alle Änderungen gegenüber dem gestrigen Tipp sind rot hervorgehoben)

' Füllt ein FlexGrid Control mit dem Inhalt einer
' Textdatei (z.B. Adressen)
' 
' "WithHeader" gibt an, ob die erste Zeile die
' Feldbeschreibung (Feldnamen) enthält (True), oder
' nicht (False)
' 
' Über "FieldSep" kann das Feld-Trennzeichen
' festgelegt werden (Vorgabe: Semikolon)
' 
' Sind Felder durch Anführungszeichen eingeschlossen,
' werden diese automatisch entfernt.
' 
' Zusätzlich werden die Spaltenbreiten des Grid-Controls
' automatisch anhand der gelesenen Daten eingestellt
' "MaxWidth" :   0 = optimale Spaltenbreite (Vorgabe)
'              > 0 = maximale Anzeigebreite
' ======================================================
Private Sub FillFlexGrid(ByVal sFilename As String, _
  ByVal WithHeader As Boolean, _
  Optional ByVal FieldSep As String = ";", _
  Optional MaxWidth As Long = 0)
 
  Dim F As Integer
  Dim sLine As String
  Dim nCols As Long
  Dim lRow As Long
  Dim lPos As Long
  Dim FieldName As String
  Dim I As Integer
  Dim sText() As String
  Dim ColumnsWidth As Long
  Dim iProz As Integer
  Dim lWidth() As Long
 
  With MSFlexGrid1
    ' zunächst FlexGrid löschen
    .Rows = 0: .Cols = 0
 
    ' Textdatei öffnen und erste Zeile einlesen
    F = FreeFile
    Open sFilename For Input As #F
 
    ' Einlesen bis Dateiende
    While Not EOF(F)
      Line Input #F, sLine
      If Trim$(sLine) <> "" Then
        ' Zeilenzähler erhöhen
        lRow = lRow + 1
        .Rows = .Rows + 1
 
        ' einzelnen Datenfelder ermitteln
        sText = SplitLine(sLine, FieldSep)
 
        ' Bei der ersten eingelesenen Zeile werden
        ' die Grid-Spalten festgelegt
        If lRow = 1 Then
          nCols = UBound(sText)
          ReDim lWidth(nCols - 1)
          .Cols = nCols
          .Row = 0
 
          ' Erste Zeile = Feldbeschreibung?
          If WithHeader Then
            ' Spalten anhand der Feldbeschreibung
            ' beschriften
            For I = 1 To nCols
              .Col = I - 1
              .Text = sText(I)
 
              ' Spaltenbreite
              If Me.TextWidth(.Text) > lWidth(.Col) Then _
                lWidth(.Col) = Me.TextWidth(.Text)
            Next I
          Else
            ' Spalten als "Feld1", "Feld2", usw.
            ' beschriften
            For I = 1 To nCols
              .Col = I - 1
              .Text = "Feld " & Format$(I + 1)
 
              ' Spaltenbreite
              If Me.TextWidth(.Text) > lWidth(.Col) Then _
                lWidth(.Col) = Me.TextWidth(.Text)
            Next I
            .Rows = .Rows + 1
          End If
        End If
 
        ' Daten dem Grid hinzufügen
        If (lRow > 1) Or (lRow = 1 And Not WithHeader) Then
          .Row = .Rows - 1
          For I = 1 To UBound(sText)
            If I > nCols Then Exit For
            .Col = I - 1
            .Text = sText(I)
 
            ' Spaltenbreite
            If Me.TextWidth(.Text) > lWidth(.Col) Then _
              lWidth(.Col) = Me.TextWidth(.Text)
          Next I
        End If
      End If
    Wend
 
    ' Textdatei schliessen
    Close #F
 
    ' zunächst die reel benötigte Gesamtbreite ermitteln
    ColumnsWidth = 0
    For I = 0 To .Cols - 1
      ' kleine Zugabe pro Spalte: 105 Twips
      lWidth(I) = lWidth(I) + 105
      ColumnsWidth = ColumnsWidth + lWidth(I)
    Next I
 
    ' Anzeigebreite für alle Spalten insgesamt
    If MaxWidth = 0 Then MaxWidth = ColumnsWidth
 
    ' Jetzt die prozentuale Breite der einzelnen Spalten
    ' aufgrund der maximal verfügbaren Anzeigebreite
    ' berechnen und die Spaltenbreiten entsprechend
    ' setzen.
    For I = 0 To .Cols - 1
      iProz = Int(lWidth(I) / ColumnsWidth * 100 + 0.5)
      .colWidth(I) = Int(MaxWidth / 100 * iProz + 0.5)
    Next I
  End With
End Sub

Beispiel für den Aufruf der Funktion:

' optimale Spaltenbreiten
FillFlexGrid App.Path & "\Adressen.txt", True, vbTab, 0
 
' Spalten prozentual an die aktuelle
' Anzeigenbreite des FlexGrids anpassen
FillFlexGrid App.Path & "\Adressen.txt", True, vbTab, _
  MSFlexGrid1.Width

Dieser Tipp wurde bereits 17.072 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2014 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.

Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel