vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - G?nnen Sie Ihrem SQL-Kommando diesen kr?nenden Abschlu?!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2016
 
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:  18.956 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise bis zu 120,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 479,20 EUR statt 599,- EUR
  • sevDTA 2.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 20,00 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 55,20 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    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 18.956 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-2016 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