vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB4, VB5, VB601.04.05
FlexGrid beim Klick auf den Spaltenbezeichner sortieren

Man kennt es eigentlich von fast jedem Datengrid. Beim Klick auf den Spaltenbezeichner lässt sich der Inhalt der Liste nach dieser Spalte sortieren. Wie aber funktioniert das beim MSFlexGrid-Control?

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  1.710 
http://www.tools4vb.de/System:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

Man kennt es eigentlich von fast jedem Datengrid. Beim Klick auf den Spaltenbezeichner lässt sich der Inhalt der Liste nach dieser Spalte sortieren.
Wie aber funktioniert das beim MSFlexGrid-Control?

Ein Ereignis á la "ColumnClick" oder "HeadClick" gibt es hier leider nicht. Die erste Schwierigkeit bestellt also schon einmal darin, in Erfahrung zu bringen, wann ein Klick auf den Spaltenbezeichner erfolgte. So schwer ist das aber gar nicht, wie nachfolgender Code zeigt:

Private Sub MSFlexGrid1_Click()
  ' Mausposition (Row und Col) abfragen
  ' Falls "MouseRow" den Wert 0 enthält, erfolgte der Klick auf einen 
  ' Spaltenbezeichner. Die Spalte selbst kann dann über die "MouseCol"-
  ' Eigenschaft ermittelt werden
  With MSFlexGrid1
    If .MouseRow = 0 Then
      ' Klick auf Spaltenbezeichner
      ' ==> jetzt Spalte ermitteln
      MsgBox "Klick auf Spalte " & CStr(.MouseCol)
    End If
  End With
End Sub

So... den Klick auf den Spaltenbezeichner können wir jetzt schon einmal "abfangen". Was jetzt noch fehlt, ist das autom. Sortieren nach der jeweiligen Spalte. Hierbei soll sowohl eine aufsteigende Sortierung, als auch eine absteigende Sortierung möglich sein, d.h. beim mehrmaligen Klick auf ein und dieselbe Spalte soll die Sortierfolge einfach umgekehrt werden. Schön wäre es auch noch, die Sortier-Spalte entsprechend farblich hervorzuheben. Bspw. könnte man eine aufsteigende Sortierung "blau" kennzeichnen, eine absteigende Sortierung "rot".

Let's go...

Um die Sortierfolge umkehren zu können, müssen wir uns die zuletzt gewählte Sortierspalte "merken" - ebenso die zuletzt gewählte Sortierrichtung (auf-/ bzw. absteigend). Hierzu deklarieren wir folgende Variablen im Allgemein-Teil der Form:

Option Explicit
 
Private nLastSortCol As Long
Private nLastSortDesc As Long

Im Click-Ereignis fügen wir nachfolgenden Code ein:

Private Sub MSFlexGrid1_Click()
  With MSFlexGrid1
    ' Klick auf Spaltenbezeichner?
    If .MouseRow = 0 And .MouseCol > 0 Then
      ' Gridinhalt sortieren
      If nLastSortCol = .MouseCol Then
        ' Sortierung umkehren
        If nLastSortDesc = flexSortGenericAscending Then
          .Sort = flexSortGenericDescending
          nLastSortDesc = flexSortGenericDescending
        Else
          .Sort = flexSortGenericAscending
          nLastSortDesc = flexSortGenericAscending
        End If
      Else
        ' aufsteigende Sortierung
        .Sort = flexSortGenericAscending
        nLastSortCol = .MouseCol
        nLastSortDesc = flexSortGenericAscending
      End If
 
      ' Spaltenbezeichner hervorheben
      ' blau: aufsteigende Sortierung
      ' rot: absteigende Sortierung
      Dim i As Long
      For i = 1 To .Cols - 1
        .Row = 0: .Col = i
        .CellForeColor = IIf(i = nLastSortCol, _
          IIf(nLastSortDesc = flexSortGenericAscending, vbBlue, vbRed), vbBlack)
      Next i
    End If
  End With
End Sub

Das Beispielprojekt zu diesem Tipp liest die Daten aus einer Datenbank aus und zeigt diese im FlexGrid-Control an. Per Klick auf die Spaltenbezeichner wird der Inhalt dann entsprechend nach der gewählten Spalte sortiert.