Page 1 sur 1
[R] Masquer des lignes dans une listview
Posté : ven. 04 juin 2010 17:59
par eric
Bonjour,
J'essaie de faire un petit bout de programme avec une liste de fichiers dans une listview.
2 Colonnes, le nom du fichier et son format. (doc ou xls)
2 checkbox en bas, une nommée doc, une autre nommée xls.
J'aimerais pouvoir réaliser un filtre, quand la checkbox doc est cochée j'aimerais afficher les fichiers doc et si elle est décochée que les fichiers doc disparaissent de la liste.
Même chose pour les xls.
Est ce possible ?
Merci
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
GUICreate("liste", 200, 200)
$listview = GUICtrlCreateListView("Nom|Format", 10, 10, 180, 150)
GUICtrlCreateListViewItem("fichier1|doc", $listview)
GUICtrlCreateListViewItem("fichier2|xls", $listview)
GUICtrlCreateListViewItem("fichier3|doc", $listview)
GUICtrlCreateListViewItem("fichier4|doc", $listview)
GUICtrlCreateListViewItem("fichier5|xls", $listview)
$doc = GUICtrlCreateCheckbox("doc", 10, 170)
GUICtrlSetState ($doc,$GUI_CHECKED)
$xls = GUICtrlCreateCheckbox("xls", 70, 170)
GUICtrlSetState ($xls,$GUI_CHECKED)
GUISetState(@SW_SHOW)
_GUICtrlListView_RegisterSortCallBack($listview)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $listview
; reclasser les colonnes
_GUICtrlListView_SortItems($listview, GUICtrlGetState($listview))
Case $msg = $doc
Case $msg = $xls
EndSelect
WEnd
_GUICtrlListView_UnRegisterSortCallBack($listview)
Re: [..] Masquer des lignes dans une listview
Posté : ven. 04 juin 2010 22:25
par Tlem
Pour faire cela, je vous conseil de mettre tous les fichiers dans un tableau, puis en fonction de votre/vos sélections, de peupler votre ListView.

Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 09:53
par eric
Bonjour Tlem,
Alors l'idée serait de mettre le contenu de la listview dans un tableau, puis de faire le ménage dans le tableau et de le réinjecter dans la listview.
Alors question bête mais comment met on le contenu d'une listview dans un tableau ?
Pour l'inverse ça va il y a _GUICtrlListView_AddArray
Merci
Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 10:38
par Tlem
Hé bien, vous partez de l'idée d'un ListView que vous avez peuplé.
Mais si au lieu de cela vous travaillez directement avec le tableau ...
Donc vous partez d'un tableau existant et avec celui-ci, vous peuplé le contrôle ListView.
Par contre, est-ce que le fait de séparer le nom de fichier et son extension est indispensable ?
On peut faire avec, mais ça complique sensiblement la gestion.
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
; Tableau 1D :
Dim $Array1[5] = ["fichier1.doc", "fichier2.xls", "fichier3.doc", "fichier4.doc", "fichier5.xls"]
; Tableau 2D :
Dim $Array2[5][2]=[["fichier1","doc"],["fichier2","xls"],["fichier3", "doc"],["fichier4", "doc"],["fichier5", "xls"]]
_ArrayDisplay($Array1, "Tableau 1D")
_ArrayDisplay($Array2, "Tableau 2D")
Une fois le tableau obtenu, vous en faites ce que vous voulez.

Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 10:59
par eric
Oui mais si je part directement depuis le tableau c'est une image un peu figée
Je m'explique : Les lignes peuvent être réordonnées en cliquant sur la colonne, du coup l'ordre n'est plus le même que dans le tableau d'origine.
Et puis il se peut aussi que j'ajoute un bouton pour supprimer une ligne, donc la aussi la listview ne correspondra plus au tableau.
En même temps mon idée de faire l'inverse n'est pas simple non plus parce que transférer une listview dans un tableau, nettoyer ce tableau puis le reinjecter dans la listview fonctionne la première fois mais pour la deuxième fois si je met la listview dans le tableau j'aurais perdu les élements masqués.
Je part peut être sur une mauvaise piste.
Pour l'extension séparée ça permet à l'utilisateur de classer les lignes par format, c'est à dire tous les doc d'abord puis les xls après ou l'inverse (en cliquant sur la colonne des formats).
Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 11:16
par Tlem
eric a écrit :Oui mais si je part directement depuis le tableau c'est une image un peu figée
Pas plus que si vous entrez les noms directement dans le code de création du ListView.
J'ai pour les besoin de l’explication créé les tableaux directement en entrant leurs nom, mais la logique voudrait que ce tableau soit créé à partir d'un fichier externe ou d'une liste contenue ou extraite à partir d'un dossier.
L'avantage d'un tableau, c'est que vous pourrez effectuer des tas d'opérations divers en dehors du contrôle ListView, ensuite une simple opération de mise à jour affichera le contenu du tableau dans le ListView.
Le fait de faire un tri avec les colonnes du ListView ne change rien. Vous pourrez continuer à le faire, mais travailler directement sur un ListView pour effectuer des opérations de filtrage, de suppression ou d'ajout, est plus 'compliqué' en terme de code que de travailler sur un tableau.
Maintenant, comme je l'ai déjà dit à d'autre, c'est votre script, donc c'est vous qui voyez.

Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 11:28
par eric
Les fichiers entrés manuellement dans la listview c'est pour l'exemple mais par la suite il seront ajoutés à partir d'une boite de dialogue de sélection de fichiers
Je suis bien conscient que travailler dans un tableau apporte une souplesse mais reste que si je supprime une ligne dans la listview à l'aide d'un bouton cela ne correspondra plus au tableau.
Et si je fais un tri dans la listview mais que je traite le tableau et que je le réinjecte après, l'ordre ne sera plus le même. (bon ça c'est un détail encore)
Mais pour l'instant je ne vois pas plus simple que cette idée donc je vais essayer.
Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 13:18
par SagePourpre
Voici un bout de code fonctionnant à partir d'un tableau :
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
Global _
$_A_fichiers[5][2] = [ _
["fichier1","doc"], _
["fichier2","xls"], _
["fichier3","doc"], _
["fichier4","doc"], _
["fichier5","xls"] _
]
GUICreate("liste", 200, 200)
$listview = GUICtrlCreateListView("Nom|Format", 10, 10, 180, 150)
Global $doc = GUICtrlCreateCheckbox("doc", 10, 170)
GUICtrlSetState ($doc,$GUI_CHECKED)
Global $xls = GUICtrlCreateCheckbox("xls", 70, 170)
GUICtrlSetState ($xls,$GUI_CHECKED)
peupler()
GUISetState(@SW_SHOW)
_GUICtrlListView_RegisterSortCallBack($listview)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $listview
; reclasser les colonnes
_GUICtrlListView_SortItems($listview, GUICtrlGetState($listview))
Case $msg = $doc
peupler()
Case $msg = $xls
peupler()
EndSelect
WEnd
_GUICtrlListView_UnRegisterSortCallBack($listview)
Func peupler()
_GUICtrlListView_BeginUpdate($listview)
_GUICtrlListView_DeleteAllItems($listview)
For $i = 0 To UBound($_A_fichiers)-1
If _IsChecked($doc) And $_A_fichiers[$i][1] = 'doc' Then GUICtrlCreateListViewItem($_A_fichiers[$i][0] & '|' & $_A_fichiers[$i][1],$listview)
If _IsChecked($xls) And $_A_fichiers[$i][1] = 'xls' Then GUICtrlCreateListViewItem($_A_fichiers[$i][0] & '|' & $_A_fichiers[$i][1],$listview)
Next
_GUICtrlListView_EndUpdate($listview)
EndFunc
Func _IsChecked($control)
Return BitAnd(GUICtrlRead($control),1) = 1
EndFunc
Si l'utilisateur supprime une entrée ou utilise d'hypothétiques flèches 'monter' 'descendre' pour changer
l'ordre des éléments, il n'y a qu'à utiliser les fonctions correspondantes pour les bouger en même temps
dans le tableau.
Re: [..] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 16:23
par eric
Ok ça fonctionne.
Merci à vous deux.
Re: [R] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 19:01
par eric
Je le mets quand même.
J'avais entre temps trouvé une autre méthode certainement moins élégante mais au moins c'est rigolo
Le principe est de créer une deuxième listview invisible et de transférer les doc ou les xls dans cette deuxième liste lorsque l'on décoche la case à l'aide de la fonction _GUICtrlListView_CopyItems et de les remettre dans la première lorsque l'on recoche la case.
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <Array.au3>
$gui1 = GUICreate("liste", 210, 210)
$listview = GUICtrlCreateListView("Nom|Format", 10, 10, 180, 150)
GUICtrlCreateListViewItem("fichier1|doc", $listview)
GUICtrlCreateListViewItem("fichier2|doc", $listview)
GUICtrlCreateListViewItem("fichier3|xls", $listview)
GUICtrlCreateListViewItem("fichier4|doc", $listview)
GUICtrlCreateListViewItem("fichier5|xls", $listview)
$doc = GUICtrlCreateCheckbox("doc", 10, 170)
GUICtrlSetState($doc, $GUI_CHECKED)
$xls = GUICtrlCreateCheckbox("xls", 70, 170)
GUICtrlSetState($xls, $GUI_CHECKED)
$gui2 = GUICreate("liste2", 210, 210)
$listview2 = GUICtrlCreateListView("Nom|Format", 10, 10, 180, 150)
GUISetState(@SW_SHOW, $gui1)
_GUICtrlListView_RegisterSortCallBack($listview)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $listview
; reclasser les colonnes
_GUICtrlListView_SortItems($listview, GUICtrlGetState($listview))
Case $msg = $doc
Call("filtrerdoc")
Case $msg = $xls
Call("filtrerxls")
EndSelect
WEnd
_GUICtrlListView_UnRegisterSortCallBack($listview)
Func filtrerdoc()
$etatdoc = GUICtrlRead($doc)
If $etatdoc = $GUI_UNCHECKED Then
For $i = 4 To 0 Step -1
$texteligne = _GUICtrlListView_GetItemTextArray($listview, $i)
_GUICtrlListView_SetItemSelected($listview, $i)
If $texteligne[2] = "doc" Then _GUICtrlListView_CopyItems(GUICtrlGetHandle($listview), $listview2, 1)
Next
Else
For $i = 4 To 0 Step -1
$texteligne2 = _GUICtrlListView_GetItemTextArray($listview2, $i)
_GUICtrlListView_SetItemSelected($listview2, $i)
If $texteligne2[2] = "doc" Then _GUICtrlListView_CopyItems(GUICtrlGetHandle($listview2), $listview, 1)
Next
EndIf
EndFunc ;==>filtrerdoc
Func filtrerxls()
$etatxls = GUICtrlRead($xls)
If $etatxls = $GUI_UNCHECKED Then
For $i = 4 To 0 Step -1
$texteligne = _GUICtrlListView_GetItemTextArray($listview, $i)
_GUICtrlListView_SetItemSelected($listview, $i)
If $texteligne[2] = "xls" Then _GUICtrlListView_CopyItems(GUICtrlGetHandle($listview), $listview2, 1)
Next
Else
For $i = 4 To 0 Step -1
$texteligne2 = _GUICtrlListView_GetItemTextArray($listview2, $i)
_GUICtrlListView_SetItemSelected($listview2, $i)
If $texteligne2[2] = "xls" Then _GUICtrlListView_CopyItems(GUICtrlGetHandle($listview2), $listview, 1)
Next
EndIf
EndFunc ;==>filtrerxls
Re: [R] Masquer des lignes dans une listview
Posté : sam. 05 juin 2010 23:14
par Tlem
eric a écrit :Le principe est de créer une deuxième listview invisible
En fait, selon l'utilisation de votre ListView, c'est l'idée de base que j'ai voulu transmettre, mais au lieu de passer sur une seconde ListView, il vaut mieux utiliser un tableau.
Techniquement, d'après ce que j'ai lu de vos prérogatives, le plus simple est de combiner ListView + Tableau.
En sachant que si vous modifiez le tableau, il faut mettre le contrôle ListView à jour et vis versa.
