Additionner des items dans une listview multiselect

cs_Maxime31 Messages postés 79 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 28 juillet 2008 - 23 mars 2007 à 21:58
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 24 mars 2007 à 18:10
Bonjour,


je souhaite utiliser un tableau listview en multiselect pour pouvoir choisir différents items, chacun ayant une valeur, et obtenir à coté du tableau la valeur totale des items selectionnés.



http://www.laryngo.com/listview2003.jpg


J'ai utilisé le tuto http://www.codeppc.com/dotnet/listview/multiselect/listviewmultiselect.htm pour avoir le multiselect sur cette listview.


Voici le code de ma form




Public Class Form1
    Inherits System.Windows.Forms.Form
    Friend WithEvents ListView1 As System.Windows.Forms.ListView
    Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
    Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu






#Region " Code généré par le Concepteur Windows Form "






    Public Sub New()
        MyBase.New()






        'Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()






        'Ajoutez une initialisation quelconque après l'appel InitializeComponent()






    End Sub






    'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        MyBase.Dispose(disposing)
    End Sub






    'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
    'Elle peut être modifiée en utilisant le Concepteur Windows Form. 
    'Ne la modifiez pas en utilisant l'éditeur de code.






    Private Declare Function GetFocus Lib "Coredll" () As Int32






    Private Declare Function GetWindowLong Lib "coredll" Alias "GetWindowLongW" (ByVal hwnd As Int32, ByVal nIndex As Int32) As Int32






    Private Declare Function SetWindowLong Lib "coredll" Alias "SetWindowLongW" (ByVal hwnd As Int32, ByVal nIndex As Int32, ByVal dwNewLong As Int32) As Int32






    Private Const GWL_STYLE = -16
    Private Const LVS_SINGLESEL As Int32 = &H4








    Private Sub InitializeComponent()
        Dim ListViewItem1 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem
        Dim ListViewSubItem1 As System.Windows.Forms.ListViewItem.ListViewSubItem = New System.Windows.Forms.ListViewItem.ListViewSubItem
        Dim ListViewItem2 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem
        Dim ListViewSubItem2 As System.Windows.Forms.ListViewItem.ListViewSubItem = New System.Windows.Forms.ListViewItem.ListViewSubItem
        Dim ListViewItem3 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem
        Dim ListViewSubItem3 As System.Windows.Forms.ListViewItem.ListViewSubItem = New System.Windows.Forms.ListViewItem.ListViewSubItem
        Me.MainMenu1 = New System.Windows.Forms.MainMenu
        Me.ListView1 = New System.Windows.Forms.ListView
        Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader
        Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader
        Me.Button1 = New System.Windows.Forms.Button
        '
        'ListView1
        '
        Me.ListView1.Columns.Add(Me.ColumnHeader1)
        Me.ListView1.Columns.Add(Me.ColumnHeader2)
        Me.ListView1.FullRowSelect = True
        ListViewSubItem1.Text = "10"
        ListViewItem1.SubItems.Add(ListViewSubItem1)
        ListViewItem1.Text = "Item1"
        ListViewSubItem2.Text = "20"
        ListViewItem2.SubItems.Add(ListViewSubItem2)
        ListViewItem2.Text = "Item2"
        ListViewSubItem3.Text = "10"
        ListViewItem3.SubItems.Add(ListViewSubItem3)
        ListViewItem3.Text = "Item3"
        Me.ListView1.Items.Add(ListViewItem1)
        Me.ListView1.Items.Add(ListViewItem2)
        Me.ListView1.Items.Add(ListViewItem3)
        Me.ListView1.Location = New System.Drawing.Point(0, 16)
        Me.ListView1.Size = New System.Drawing.Size(232, 168)
        Me.ListView1.View = System.Windows.Forms.View.Details
        '
        'ColumnHeader1
        '
        Me.ColumnHeader1.Text = "ITEM"
        Me.ColumnHeader1.Width = 175
        '
        'ColumnHeader2
        '
        Me.ColumnHeader2.Text = "SCORE"
        Me.ColumnHeader2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
        Me.ColumnHeader2.Width = 57
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(0, 240)
        Me.Button1.Text = "Quitter"
        '
        'Form1
        '
        Me.ClientSize = New System.Drawing.Size(234, 288)
        Me.Controls.Add(Me.Button1)
        Me.Controls.Add(Me.ListView1)
        Me.Menu = Me.MainMenu1
        Me.Text = "Form1"






    End Sub






#End Region






    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Ret As Boolean = ListViewMultiSelect(ListView1)
    End Sub






    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub






    Public Function ListViewMultiSelect(ByVal wLV As ListView) As Boolean
        Dim LVhWnd As Int32
        Dim Retval As Int32






        wLV.Focus()






        If wLV.Focus() Then
            LVhWnd = GetFocus()
            Retval = GetWindowLong(LVhWnd, GWL_STYLE)
            Retval = Retval And (Not LVS_SINGLESEL)
            SetWindowLong(LVhWnd, GWL_STYLE, Retval)
            Return True
        Else
            Return False
        End If
    End Function






End Class





Comment faire pour que les items selectionnés aient leur valeur totale affichée sur cette form ?


Merci d'avance a ceux qui pourront m'aider


Maxime

15 réponses

troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
24 mars 2007 à 00:01
Salut !

Je comprend rien du tout a ton code !
si tu veux faire une listView en multi-selection pour quoi n'utilise tu pas la propriété MultiSelect a True de ta ListView ?

Puis pour connais les selections de tes Items de ta ListView il faut les lire un par un pour savoir si la selection est activé ou pas, rien de rien compliquer :)

Cordialement,

http://www.troxsa.info/
Le site qui ne parle qu'un seul langage, visual basic 2005
0
cs_Maxime31 Messages postés 79 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 28 juillet 2008
24 mars 2007 à 00:11
Parce que en VB.NET (2003), apparement, la fonction multiselect n'est pas disponible dans les listview.


C'est pour ca que je suis passé par ce tutorial qu'on m'a indiqué..
http://www.codeppc.com/dotnet/listview/multiselect/listviewmultiselect.htm

En outre, comme je débute vraiment et que je cherche les infos au fur et a mesure de mes besoins, je ne sais pas comment lire une selection, et ajouter sa valeur a un compteur.

Dans mon idée, je pensais essayer un boutton appelé "total", qui, 'regarde' tous les endroits selectionnés et fait le total. Mais je ne sais pas comment le réaliser.

Si c'est pas compliqué ni long, est ce que tu peux me dire comment 'regarder' un item (en pratique, la valeur numérique dans la colonne de droite pour le cas qui m'interesse, cf capture d'écran http://www.laryngo.com/listview2003.jpg ), et je pense arriver à faire la même chose pour les 30 ou 40 autres items dont j'aurai besoin.

Merci pour ta réponse en tout cas

Maxime
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 mars 2007 à 00:18
Bonsoir,
je ne sais rien de rien de VB.Net, c' est pourquoi je me demandais
si ta listview n' a pas, comme en VB6, la propriété CheckBox, qui
corresponderait à une selection ...
Si tel est le cas pourquoi ne pas parcourir ta ListView et incrémenter
une variable par la valeur de ton item si la ligne est cochée ?


 
0
cs_Maxime31 Messages postés 79 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 28 juillet 2008
24 mars 2007 à 00:33
Si, la propriété checkbox existe, je l'ai activé, cf ma capture d'écranhttp://www.laryngo.com/listview2003.jpg

Le principe que tu proposes me parait vraiment parfait pour ce dont j'ai besoin. C'est juste que je ne sais pas comment le faire, et donc c'est pour cette raison que je viens chercher un peu d'aide ici.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 mars 2007 à 03:12
je vais essayer de t' expliquer en utilisant un evenement VB6


Au départ
 - Tous les Items sont non sélectionnés
 - Une variable Total à 0


Dans la procédure
 ListView_ItemCheck(ByVal Item As MSComctlLib.ListItem)
   'regardes si tu as une semblable ...
   'Elle se produit à chaque fois que tu coches ou décoches un ligne.
   'Tu testes ensuite sur l' état de cette ligne
  
  If Item.Checked = true  Then 'ligne sélectionnée
      Total=Total + CInt(ListView.ListItems(Item.Index).ListSubItems(1).Text )
   Else  'la ligne est désélectionnée
     Total=Total - CInt(ListView.ListItems(Item.Index).ListSubItems(1).Text )
  End If


 'remarque:  Item.Index te renvoie le N° de ligne
 'et ListSubItems(1) est la colonne ou est inscrit le score


Ensuite tu transcrit Total dans un Label, par exemple


End Sub

PS: je sais que c' est tard, mais je me suis juste levé pour
un besoin pressant...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 mars 2007 à 07:48
Bonjour, maxime31,


Il me semble que, tout en bas du lien où tu as trouvé ton code, figure une remarque, que tu devrais pouvoir mettre à profit...
La voici, donc :

"Conclusion



Le plus fort dans l'histoire, c'est que vous pouvez sans aucun problème récupérer tous les items sélectionnés en consultant la collection "SelectedIndices" qui reflète à merveille la situation réelle."
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 mars 2007 à 10:02
Bonjour jmfmarques,
l' avantage de ItemCheck est que c' est instantané...

A+
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
24 mars 2007 à 11:26
Salut,

Je vois que tu veux sélectionner plusieurs items dans ta listview. Le mieux c'est que tu télécharges une version plus récente de visual basic. Il existe en effet un logiciel gratuit par Microsoft : Microsoft Visual Basic 2005 Express Edition. c'est une version légèrement allégé mais qui reste très performant.

D'autant plus qu'avec ce logiciel, pour les listview, tu as la propriété multiselect qui te permet de sélectionner plusieurs items en même temps.

Et voici le code avec le logiciel proposé ci dessus pour récupérer le contenu d'une colonne des items sélectionnés :

For Each item As String In ListView1.SelectedItems.Item(0).Text
    MsgBox(item, MsgBoxStyle.OkOnly)
Next
, ----

(Coloration syntaxique automatique par Kenji)

PS :

 Item(0) : première colonne
 Item(1) : deuxième colonne
 Item(2) : troisième colonne
 .........

@+
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 mars 2007 à 11:38
Ah... Fauve... tu rachètes un peu là la mauvaise image que je commençais à avoir de VB.Net (que je n'ai pas... et que je n'ai pas non plus l'intention d'acquérir pour plusieurs raisons de l'espèce qui, ajoutées à ses lourdeurs et certaines lenteurs, ne me le rendent pas vraiment sympathique...)
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
24 mars 2007 à 12:06
c' est ça jmfmarques, résistons....et repoussons les attaques incessantes ...
des "fauves"  
Mais qu' est ce qu' ils ont tous à vouloir nous convertir à tout prix ?
On est bien nous avec notre VB6 !
0
Utilisateur anonyme
24 mars 2007 à 12:11
Maxime, je t'ai répondu sur ton précédent topic

http://www.vbfrance.com/infomsg_PETIT-BUG-APPLIQUANT-TUTORIAL-CAPTURE-ECRAN_909020.aspx


Ton application est-elle vraiement destiner pour des pocketpc ?



fauve, t'as du aller un peu vite, la tu liste les caractéres du texte de l'item séléctionner. Ceci conviendrai mieux :





For Each Item As ListViewSubItem In ListView1.SelectedItems.Item(0).SubItems
  System.Windows.Forms.MessageBox.Show(Item.Text)
Next,

----

(Coloration syntaxique automatique par Kenji)



(Item sert à récupére l'un des élément de la collection des items séléctionner)






__________
Kenji
0
Utilisateur anonyme
24 mars 2007 à 12:17
chaibat et jmf, je suis passé en dotnet depuis un moment mais je ne lâche pas mon bon vieux vb6 avec qui j'ai appris pleins de choses. D'ailleurs, en ce moment, je m'en sers plus que dotnet. (et oui, il est plus rapide)


__________
Kenji
0
cs_Maxime31 Messages postés 79 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 28 juillet 2008
24 mars 2007 à 17:45
J"ai essayé de réaliser la solution de Charles Racaud.

J4ai intégré ce code dans un private sub de boutton. Le but etant donc d'afficher le total des items lorsque le boutton est affiché.

J'ai mit item(1) car c'est le total de la seconde colonne qui m'interesse.

Ca donne ca :

Public


Class
Form1

Private
Sub Button1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
Button1.Click

   Me.Close()

End
Sub


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

End
Sub


Private
Sub ListView1_SelectedIndexChanged(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
ListView1.SelectedIndexChanged

End
Sub

Private
Sub Button2_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
Button2.Click

For
Each Item
As ListViewSubItem
In
ListView1.SelectedItems.Item(1).SubItemsSystem.Windows.Forms.MessageBox.Show(Item.Text)

Next

End
SubEnd


Class

J'ai deux messages d'erreurs :

Erreur 1 Type 'ListViewSubItem' non défini
Erreur 2 'SelectedItems' n'est pas un membre de 'System.Windows.Forms.ListView'. 
0
cs_Maxime31 Messages postés 79 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 28 juillet 2008
24 mars 2007 à 17:48
Lorsque le boutton est cliqué je voulais dire
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 mars 2007 à 18:10
doublon supprimé, merci Kenji
0
Rejoignez-nous