PROGRESSBAR DANS LISTVIEW EN VB.NET

cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007 - 29 mars 2005 à 15:51
Mario1095 Messages postés 168 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 6 mai 2009 - 13 janv. 2008 à 07:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30251-progressbar-dans-listview-en-vb-net

Mario1095 Messages postés 168 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 6 mai 2009 1
13 janv. 2008 à 07:19
Pas MAL
cs_dectroo Messages postés 30 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 31 mars 2010
6 juil. 2007 à 10:19
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.
FreeZeBiT Messages postés 4 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 22 août 2005
22 août 2005 à 09:22
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
FreeZeBiT Messages postés 4 Date d'inscription lundi 15 avril 2002 Statut Membre Dernière intervention 22 août 2005
22 août 2005 à 08:49
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
winsave Messages postés 21 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 1 septembre 2005
10 août 2005 à 16:20
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
vingaboy Messages postés 1 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 9 août 2005
9 août 2005 à 04:12
Salut, je trouve le code simple et ca donne l'opportunité d'ajouter d'autre type control comme ComboBox et TrackBar et bien d'autre...

Apres avoir tester le code et réussi, j'ai trouver des problèms, il s'agit du redimension de la colonne en dessous duquel il y'a le progressbar, j'ai cherché un événement pour le redimensionnement d'une colone de ListView mais y'en a pas???
Aussi un autre probleme, c'est lorsque j'ai plusieur lignes, et chaque ligne à son propre progressbar, le positionnemt des progressbar rest static ca change pas lors du défilement des lignes, également j'ai pas trouver l'événement du defiliment des ligne parmi les evenement du ListView???

Je souhaite que quelque à une idée!!!
cs_innosoft Messages postés 1 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 11 juillet 2005
11 juil. 2005 à 05:35
good
GLLNS Messages postés 4 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 15 juin 2005
15 juin 2005 à 12:29
Thanks
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
29 mars 2005 à 15:51
exellent!
Rejoignez-nous