Progressbar dans listview en vb.net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 116 fois - Téléchargée 34 fois

Contenu du snippet

Voici une petite fonction qui ajoute une ProgressBar dans une ListView sur le ListViewItem souhaité et la colonne souhaitée.
Faîtes toute fois attention car je n'ai pas inclus de contrôle sur les index que l'on donne ni sur d'éventuelles erreurs...

Source / Exemple :


Public Function ListView_AddProgressBar(ByRef pListView As System.Windows.Forms.ListView, ByVal ListViewItemIndex As Integer, ByVal ColumnIndex As Integer) As System.Windows.Forms.ProgressBar
        Dim r As Rectangle
        Dim pb As New System.Windows.Forms.ProgressBar

        r = pListView.Items(ListViewItemIndex).Bounds()
        r.Width = pListView.Columns(ColumnIndex).Width
        If ColumnIndex > 0 Then
            r.X = r.X + pListView.Columns(ColumnIndex - 1).Width
        End If
        pb.Parent = pListView
        pb.SetBounds(r.X, r.Y, r.Width, r.Height)
        pb.Visible = True

        Return pb
    End Function

A voir également

Ajouter un commentaire Commentaires
Messages postés
168
Date d'inscription
vendredi 14 septembre 2007
Statut
Membre
Dernière intervention
6 mai 2009
1
Pas MAL
Messages postés
30
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
31 mars 2010

salut, ton code es texcellent mé jarrive pas à le compiler car j'utilse seulement l Vb6 et non pas le .Net
Si quelqu'un peut me traduire le code en Vb6? j'en ai besoin vraiment, ou just s'il ya une outil pour traduire.
merci d'avence.
Messages postés
4
Date d'inscription
lundi 15 avril 2002
Statut
Membre
Dernière intervention
22 août 2005

On peut aussi tout gérer dans le Thread directement...
Avec cette méthode, on peut utiliser plusieurs ListView sans problème mais je crains que ce ne soit un peu "lourd" si on a beaucoup de ListView et/ou beaucoup d'Items... à voir...

Private Structure ListViewProgressBarStruct
Dim oProgressBar As ProgressBar
Dim oListView As ListView
Dim oListViewItem As ListViewItem
Dim ColumnIndex As Integer
End Structure

Dim CollProgressBars As Collection
Dim thListView As System.Threading.Thread

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer

With ListView1
.View = View.Details
.Columns.Add("colonne 1", (.Width / 2) - 10, HorizontalAlignment.Left)
.Columns.Add("colonne 2", (.Width / 2) - 10, HorizontalAlignment.Left)

For i = 1 To 20
Dim li As ListViewItem = .Items.Add("Ligne " & i)
Dim si As ListViewItem.ListViewSubItem = li.SubItems.Add("")
Next
End With

' instancie la collection des ProgressBars
CollProgressBars = New Collection

' ajoute des ProgressBars dans notre ListView
ListView_AddProgressBar(ListView1, 0, 1)
ListView_AddProgressBar(ListView1, 9, 1)
ListView_AddProgressBar(ListView1, 19, 1)

' démarre le Thread qui gère le redimensionnement et le défilement pour les ProgressBars
thListView = New System.Threading.Thread(AddressOf ListView_ProgressBarThread)
thListView.Priority = Threading.ThreadPriority.Lowest ' priorité basse : pas besoin de consommer du proc pour rien
thListView.Start()
End Sub

Private Function ListView_AddProgressBar(ByRef pListView As System.Windows.Forms.ListView, ByVal ListViewItemIndex As Integer, ByVal ColumnIndex As Integer) As System.Windows.Forms.ProgressBar
Dim r As Rectangle
Dim pb As New ProgressBar

' ajoute la ProgressBar dans l'Item du ListView sur la colonne souhaitée
r = pListView.Items(ListViewItemIndex).Bounds()
r.Width = pListView.Columns(ColumnIndex).Width
If ColumnIndex > 0 Then
r.X = r.X + pListView.Columns(ColumnIndex - 1).Width
End If
pb.Parent = pListView
pb.SetBounds(r.X, r.Y, r.Width, r.Height)
pb.Visible = True

' garde en mémoire les infos sur cette ProgressBar
Dim lvpb As New ListViewProgressBarStruct
lvpb.ColumnIndex = ColumnIndex
lvpb.oListView = pListView
lvpb.oProgressBar = pb
lvpb.oListViewItem = pListView.Items(ListViewItemIndex)
CollProgressBars.Add(lvpb)

' retourne la ProgressBar
Return pb
End Function

Private Sub ListView_ProgressBarThread()
Dim lvpb As ListViewProgressBarStruct

While True
For Each lvpb In CollProgressBars
With lvpb
' redimensionne la ProgressBar sur la colonne
.oProgressBar.Width = .oListView.Columns(.ColumnIndex).Width
If .ColumnIndex > 0 Then .oProgressBar.Left = .oListView.Columns(.ColumnIndex - 1).Width

' affiche / cache la ProgressBar en fonction que l'Item sur lequel elle se trouve est visible ou non dans la liste
Dim r As Rectangle = .oListViewItem.Bounds
If (r.Top >= .oListView.Top) AndAlso (r.Top <= .oListView.Top + .oListView.Height) Then
.oProgressBar.Top = r.Top
.oProgressBar.Visible = True
Else
.oProgressBar.Visible = False
End If
End With

Application.DoEvents()
Next
End While
End Sub

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
thListView.Abort() ' termine le Thread avant de quitter le prog
End Sub
Messages postés
4
Date d'inscription
lundi 15 avril 2002
Statut
Membre
Dernière intervention
22 août 2005

Effectivement, on est obligé de gérer le redimensionnement ainsi que le défilement manuellement, ce qui n'est pas forcément chose aisée...

Pour redimensionner, le code de Wisave me paraît bon (je ne l'ai pas testé), le seul truc qui me gène est que la procédure ResizeProgressbars est appelée tout le temps depuis le MouseMove, moi je pense que je ne l'appellerai que si le bouton gauche de la souris est enfoncé...

Pour le défilement, je pense que le plus simple serait d'utiliser un Thread de la façon suivante :

Dim CollProgressBars As Hashtable ' collection des ProgressBar et de leur ListViewItem
Dim LastTopItem As ListViewItem ' le dernier premier ListViewItem affiché
Dim thListView As System.Threading.Thread ' le Thread qui gère l'affichage des ProgressBar

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer

With ListView1
.View = View.Details
.Columns.Add("colonne 1", (.Width / 2) - 10, HorizontalAlignment.Left)
.Columns.Add("colonne 2", (.Width / 2) - 10, HorizontalAlignment.Left)

' on ajoute des Items et SubItems
For i = 1 To 20
Dim li As ListViewItem = .Items.Add("Ligne " & i)
Dim si As ListViewItem.ListViewSubItem = li.SubItems.Add("")
Next
End With

' on instancie la collection
CollProgressBars = New Hashtable

' on ajoute des ProgressBars dans nos Items
ListView_AddProgressBar(ListView1, 0, 1)
ListView_AddProgressBar(ListView1, 9, 1)
ListView_AddProgressBar(ListView1, 19, 1)

' on démarre le Thread qui va affiché ou non les ProgressBar si les Items sont visibles
thListView = New System.Threading.Thread(AddressOf ListView_ScrollProgressBar)
thListView.Priority = Threading.ThreadPriority.Lowest ' priorité basse : pas besoin de bouffer du proc pour rien
thListView.Start()
End Sub

Private Function ListView_AddProgressBar(ByRef pListView As System.Windows.Forms.ListView, ByVal ListViewItemIndex As Integer, ByVal ColumnIndex As Integer) As System.Windows.Forms.ProgressBar
Dim r As Rectangle
Dim pb As New ProgressBar

r = pListView.Items(ListViewItemIndex).Bounds()
r.Width = pListView.Columns(ColumnIndex).Width
If ColumnIndex > 0 Then
r.X = r.X + pListView.Columns(ColumnIndex - 1).Width
End If
pb.Parent = pListView
pb.SetBounds(r.X, r.Y, r.Width, r.Height)
pb.Visible = True

' on ajoute notre ProgressBar à notre collection et on conserve l'Item auquel elle appartient
CollProgressBars.Add(pb, pListView.Items(ListViewItemIndex))

Return pb
End Function

Private Sub ListView_ScrollProgressBar()
Dim li As ListViewItem
Dim pb As ProgressBar
Dim CurTopItem As ListViewItem

While True
CurTopItem = ListView1.TopItem ' récupère le premier Item affiché
If Not LastTopItem Is CurTopItem Then ' s'il est différent d'avant
For Each li In CollProgressBars.Values ' pour chaque Item contenant une ProgressBar
Dim r As Rectangle = li.Bounds() ' récupère ses dimensions
If (r.Top >= ListView1.Top) AndAlso (r.Top <= ListView1.Top + ListView1.Height) Then
' si cet Item est bien affiché dans la liste
For Each pb In CollProgressBars.Keys ' pour chaque ProgressBar de notre collection
If CollProgressBars.Item(pb) Is li Then ' si elle est contenu dans notre Item
pb.Top = r.Top ' on place la ProgressBar à la même hauteur
pb.Visible = True ' on l'affiche
End If
Next
Else
' si cet Item n'est pas affiché dans la liste
For Each pb In CollProgressBars.Keys ' pour chaque ProgressBar de notre collection
If CollProgressBars.Item(pb) Is li Then ' si elle est contenu dans notre Item
pb.Visible = False ' on la cache
End If
Next
End If
Next
LastTopItem = CurTopItem ' on stocke le premier Item affiché
End If
End While
End Sub

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
thListView.Abort() ' on n'oublie pas de terminé le Thread avant de quitter le prog
End Sub
Messages postés
21
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
1 septembre 2005

Mon idée est de redimentionner sur MouseMove.

'// Déclarations :
Private curLi As ListViewItem
Private curProgressGlobale As System.Windows.Forms.ProgressBar
Private CollProgressbarGlobales As New Collection

private sub TestIt
'// 2 colonnes par exemples
curLi = ListView1.Items.Add("Test")
curLi.SubItems.Add("") 'progression bar
curLi.SubItems.Add("0 %") '%

'// on récupére curProgressGlobale pour traitement ultérieur
curProgressGlobale = ListView_AddProgressBar(ListView1, curLi.Index, 1, CollProgressbarGlobales)

end sub

Public Function ListView_AddProgressBar(ByRef pListView As System.Windows.Forms.ListView, ByVal ListViewItemIndex As Integer, ByVal ColumnIndex As Integer, ByRef CollProgressbar As Collection) As System.Windows.Forms.ProgressBar
Dim r As Rectangle
Dim pb As New System.Windows.Forms.ProgressBar
Try
r = pListView.Items(ListViewItemIndex).Bounds()
r.Width = pListView.Columns(ColumnIndex).Width
If ColumnIndex > 0 Then
r.X = r.X + pListView.Columns(ColumnIndex - 1).Width
End If
pb.Parent = pListView
pb.SetBounds(r.X, r.Y, r.Width, r.Height)
pb.Visible = True
If Not pb Is Nothing Then
CollProgressbar.Add(pb)
End If
Catch exc As Exception
MsgBox(exc.Message, MsgBoxStyle.Critical)
End Try
Return pb
End Function


Private Sub ListView1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
ResizeProgressbars(CollProgressbarGlobales)
End Sub

Private Sub ResizeProgressbars(ByRef CollProgressbar As Collection)
'// on redimentionne l'ensemble
If Not CollProgressbar Is Nothing Then
Dim curEnum As IEnumerator
Dim CurProgress As ProgressBar
curEnum = CollProgressbar.GetEnumerator
While curEnum.MoveNext
CurProgress = curEnum.Current()
CurProgress.Left = ListView1.Columns(0).Width + 5
CurProgress.Width = ListView1.Columns(1).Width - 5
End While
End If

End Sub


Voili voilou ; par contre l'ajout de deux progressbar sur le même item semble poser pb.

Sam.
http://www.c6pratik.com
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (FreeZeBiT)