vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Sch?tzen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück
Rubrik: Controls · ListView   |   VB-Versionen: VB4, VB5, VB621.07.03
ProgressBar im ListView-Control

Wie? Eine ProgressBar in einer ListView-Spalte anzeigen? Geht nicht! Weit gefehlt... geht doch :-)

Autor:   Dietmar G. BayerBewertung:     [ Jetzt bewerten ]Views:  22.736 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Letzte Woche haben wir Ihnen eine Möglichkeit gezeigt, wie sich eine ProgressBar in einer StatusBar anzeigen lässt. Wie wäre es nun, eine ProgressBar in einer ganz bestimmten Spalte im ListView-Control anzuzeigen?

Sie werden sich jetzt sicherlich denken:
"Wie? Eine ProgressBar in einer ListView-Spalte anzeigen? Geht nicht!"

Weit gefehlt... geht nämlich doch

Voraussetzung:
Sie verwenden ein ListView-Control, dessen Spalte der Anwender nicht verändern darf!

"Wie? Spalten nicht verändern? Das lässt sich doch gar nicht einstellen! Der Anwender kann die Spaltenbreiten doch immer und sowieso ändern!"

Nochmals weit gefehlt... mit einem kleinen Trick werden aus dem Resizable-Columns mal eben ganz schnell Fix-Columns

Hierzu erstellen wir zur Laufzeit einfach ein paar CommandButtons und legen diese exakt auf die Spaltenbezeichner im ListView. Nicht mehr und nicht weniger.

"Und die ProgressBar?"
Ja stimmt: diese verpflanzen wir wieder mit "SetParent" in das ListView - genau so, wie wir es beim Tipp mit der StatusBar getan haben.

Nun genug Gerede... jetzt wird gecodet

Erstellen Sie ein neues Projekt und ziehen auf die Form:

  • ein ListView-Control (ListView1)
  • eine ProgressBar (ProgressBar1)
  • ein Command-Button (cmdColumn) mit der Eigenschaft Index = 0
  • ein weiteren Command-Button (cmdStart) zum Starten der ProgressBar
  • sowie ein Timer-Control (Timer1)

Option Explicit
 
' Benötigte API-Deklarationen
Private Declare Function SetParent Lib "user32" ( _
  ByVal hWndChild As Long, _
  ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
  Dim i As Long
  Dim oColumn As ColumnHeader
  Dim oItem As ListItem
 
  ' ListView-Eigenschaften festlegen
  With ListView1
    .View = lvwReport
    .FullRowSelect = True
    .LabelEdit = lvwManual
    .GridLines = True
    .HideSelection = True
 
  End With
 
  ' Spalten erstellen
  With ListView1.ColumnHeaders
    .Add , , "File", 1200
    .Add , , "Version", 900
    .Add , , "Download", 1800
    .Add , , "Date", ListView1.Width - 3900 - 330
  End With
 
  ' ein paar Test-Einträge
  For i = 1 To 3
    Set oItem =  ListView1.ListItems.Add()
    With oItem
      .Text = "File" + CStr(i)
      .SubItems(1) = "1.0.0.0"
      .SubItems(3) = Now
    End With
  Next i
 
  ' CommandButtons über ListView-Columns legen
  lvw_SetNewHeader
 
  ' ProgressBar zunächst ausblenden
  ProgressBar1.Visible = False
End Sub
Private Sub lvw_SetNewHeader()
  ' CommandButtons über ListView-Columns legen
  Dim i As Long
 
  cmdColumn(0).Visible = False
  With ListView1.ColumnHeaders   
    For i = 1 To .Count
      ' CommandButton laden
      Load cmdColumn(i)
 
      ' Größe festlegen
      cmdColumn(i).Top = 0
      cmdColumn(i).Left = .Item(i).Left
      cmdColumn(i).Width = .Item(i).Width + 15
      cmdColumn(i).Height = ListView1.ListItems.Item(1).Height
 
      ' Beschriften, Anzeigen...
      cmdColumn(i).Caption = .Item(i).Text
      cmdColumn(i).Visible = True
 
      ' ...und ab ins ListView
      SetParent cmdColumn(i).hwnd, ListView1.hwnd
      cmdColumn(i).ZOrder
    Next i
  End With
End Sub

Die ProgressBar selbst soll jederzeit in einer beliebigen Zeile/Spalte angezeigt werden können:

Private Sub lvw_ShowProgressBar(ByVal nRow As Long, _
  ByVal nCol As Long)
 
  ' ProgressBar in beliebiger 
  ' Zeile/Spalte anzeigen
 
  Dim i As Long
  Dim nLeft As Long
  Dim nTop As Long
  Dim nHeight As Long
  Dim nWidth As Long
 
  ' Positon: Left, Width
  With ListView1.ColumnHeaders
    For i = 1 To nCol - 1
      nLeft = nLeft + .Item(i).Width
    Next i
    nWidth = .Item(nCol).Width
  End With
 
  ' Position: Top, Height
  With ListView1.ListItems
    For i = 1 To nRow
      nTop = nTop + .Item(i).Height
    Next i
    nHeight = .Item(nRow).Height
  End With
 
  ' ProgressBar anzeigen
  With ProgressBar1
    SetParent .hwnd, ListView1.hwnd
    .Left = nLeft
    .Top = nTop
    .Width = nWidth
    .Height = nHeight
    .Visible = True
    .Value = 0
  End With
End Sub

Beim Klick auf den Start-Button soll die ProgressBar in der 2. Zeile und 3. Spalte angezeigt werden:

Private Sub cmdStart_Click()
  ' ProgressBar sichtbar machen
  lvw_ShowProgressBar 2, 3
 
  ' Timer initialisieren
  Timer1.Interval = 25
  Timer1.Enabled = True
 
  ' CommandButton deaktivieren
  cmdStart.Enabled = False
End Sub
' Fortschrittsbalken
Private Sub Timer1_Timer()
  With ProgressBar1
    If .Value < .Max Then
      .Value = .Value + 1
    Else
      Timer1.Enabled = False
      cmdStart.Enabled = True
      ProgressBar1.Visible = False
    End If
  End With
End Sub

Sollen mehrere ProgressBar-Controls gleichzeitig angezeigt werden, einfach ein Steuerelementfeld erstellen und die Prozdur lvw_ShowProgressBar um einen "Index"-Paramater erweitern

Stop! Da fehlt doch noch etwas!
Da die CommandButtons nun direkt auf den ListView-Spaltenbezeichner liegen, lassen sich diese ja gar nicht mehr anklicken - z.B. für eine autom. Sortierung.

Also noch schnell folgenden Code einfügen, und schon geht's wieder:

Private Sub cmdColumn_MouseUp( Index As Integer, _
  Button As Integer, Shift As Integer, _
  X As Single, Y As Single)
 
  ' Sortierung
  Select Case Index
    Case 1, 2, 4
      With ListView1
        .SortKey = Index - 1
        .SortOrder = lvwDescending
        .Sorted = True
      End With
    Case Else
      Beep
  End Select
End Sub

Dieser Tipp wurde bereits 22.736 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-2021 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