Déplacer les item d'un listview

Résolu
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009 - 21 août 2006 à 11:08
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009 - 9 sept. 2006 à 02:06
Bonjours

J'ai une ListView dans mon programme avec une dizaine de colonne et la même quantité de lignes et j'aimerai pouvoir déplacer les lignes, les intervertir.

Je suis sur un programme de commande de marchandise et c'est afin de remettre les lignes de la commande dans le même ordre que sur la souche papier.

Merci à quiconque qui saurait comment faire la manipulation

Salutations

12 réponses

mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009
8 sept. 2006 à 01:03
Voila, j y suis parvenu. Ca n'a pas été compliqué, mais je suis de plus en plus décu par l'ergonomie à chier des termes et des méthodes d'acces de vb.net, le soi disant language d'avnir qui procure de sacré retours en arrière...

A part ca ne regardez pas l'orthographe... j'espere que ca fera gagner du temps a certains!

'****************************************************************************

' BougerLignes [ Private Sub ]
'----------------------------------------
' Auteur : mrhemp
'
' Date : 05.08.2006
'
' Description : Cette fonction permet de monter ou descendre une ligne dans un
'                         listview.
'
' Paramètres : ByVal intDeplacement As Integer -> on donne -1 pour monter
'                                                                                                            1 pour descendre
'
' Retours : -
'
'
'******************************************************************
'----------------------------------------------------------------------------------------------
Private
Sub BougerLignes(
ByVal intDeplacement
As
Integer)

'Tableau qui stock temporairement les valeurs
Dim arr_Ligne(9)

'Récupère l'index de la ligne sélectionnée
Dim intPositionLigne
As
Integer

'variable de boucle
Dim intCpt
As
Integer

'Récupère localement le N° de ligne car une fois la ligne bougée,
'la valeurs sera de -1 et on ne pourra pas sélectionnel la ligne -1
intPositionLigne = m_indexLigneSelectionnee

With lswCommande

      'Parcours les 9 colones du listview
      For intCpt = 0
To 9

         'Récupère les valeurs des ncolonnes de la ligne sélectionnée
         arr_Ligne(intCpt) = .Items(intPositionLigne).SubItems(intCpt).Text

      Next

      'Parcours les 9 colones de la ligne "vidée"
      For intCpt = 0
To 9

         'Remplacement des données par celle de la ligne à intervertir
         .Items(intPositionLigne).SubItems(intCpt).Text = _
         .Items(intPositionLigne + intDeplacement).SubItems(intCpt).Text

      Next

      'Parcour les colonnes de la ligne de desination
      For intCpt = 0
To 9

         'Recopie les valeurs de la ligne que l'on voulait déplacer dans
         'sa nouvelle colonne
         .Items(intPositionLigne + intDeplacement).SubItems(intCpt).Text = arr_Ligne(intCpt)

      Next

      'Sélectionne la ligne que l'on vien de déplacer
      lswCommande.Items(intPositionLigne + intDeplacement).Selected =
True

      'Récupère l'index de la ligne selectionnée
      m_indexLigneSelectionnee = intPositionLigne + intDeplacement
      'ATTENTION: Entre les deux ligne précédente l'évenement 
      'lswCommande_SelectedIndexChanged s'execute et la variable globale de la
      'ligne sélectionnée est remise à zéro pour nouvelle écriture.
      'Or ici on la resélectionne. Donc on réassigne la valeur de la ligne.
End
With

End
Sub
3
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
21 août 2006 à 11:34
Bonjour,
Je n' ai jamais envisagé cette possibilité, mais c' est en lisant
ta question qu' il m' est venue une idée.
Je te la soumet telle qu' elle et de manière brute.A toi de la develloper.


Elle se résume à un Coipier/Coller et se présenteraoit sous forme
d' une fonction dont les paramètres serait
 FirstRow= L' index de la ligne d' ou tu copies
 LastRow = L' index de la ligne d' ou tu colles


Dans le corps de la fonction
  -Tu sauvegardes les données de la FirstRow (dans un tableau par exemple)
  -Tu transfères les données de la LastRow vers la FirstRow
  -Tu transfères les données sauvées vers la LastRow


Pour les actions Copier et Coller tu définies une touche de fonction pour
chacune d' elle.
Exemple F5=Copier  .
                 F10=Coller.

-Tu sélectionnes une ligne
-Tu presses F5
-Tu vas vers l' autre ligne
-Tu presses F10

Bien sûr après F10 il faut tester si F5 a été pressée précédement.


Bon c' est une idée qui mérite peut être d' être étudiée.


chaibat
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
21 août 2006 à 20:06
Salut, petit exemple d'échange entre la 1ère et la 2ème ligne d'une listview à 1 colonne :

Private Sub Command1_Click()
Dim save_nom As String
  save_nom = ListView1.ListItems(1).Text
  ListView1.ListItems(1).Text = ListView1.ListItems(2).Text
  ListView1.ListItems(2).Text = save_nom
End Sub

Je te laisse faire le reste.
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
21 août 2006 à 23:29
Bonjour,


Dolphin Boy c'est bien quand tu as que 2 items mais quand tu en a 500 ça devien chaud a faire  non ?
Voila le code que j'aurais fait ! (attention il n'est pas obtimiser)


<hr />
For i As Integer = 0 To LV.Items.Count - 1
If LV.Items.Item(i).Selected = True Then
LV.Items.Insert(i + 2, LV.Items.Item(i).Text)
LV.Items.Item(i).Remove()
LV.Items.Item(i + 1).Selected = True
LV.Focus()
Return
End If
Next


<hr />
La listView1 que j'ai renomé Lv
La form que j'ai fait comporte qu'un bouton et une ListView (LV) et 5 Items

Cordialement,
http://www.troxsa.info/
Le site qui ne parle qu'un seul langage, visual basic 2005
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
22 août 2006 à 00:50
Bonsoir tout le monde,
Cher Troxsa,
Il adit intervertir : Pour moi ça veut dire
  - Sélectionner une ligne
  - Aller vers une autre ligne 
  - L' insérer.
  Est- ce quand dans une boucle tu peux savoir quelle ligne va être
  intervertit avec quelle autre ? Je ne le penses pas.
  
   Quand au nombre de lignes, s' il trouve que c' est
   beaucoup, à moins d' inventer une boucle intelligente,
   je ne vois pas comment on peut faire ça d' un seul coup.

   Et combien même il pourrait le faire, comment il peut sauvegarder
   ce qu' il a fait. Si sa liste venait à se rafraichir il aura tout perdu.
   A mois de laisser sa liste ouverte tout le long de l' exécution de son prog,
   ou de sauvegarder le tri.Et ça c' est une autre pair de manche !
      

   chaibat
   
   
  
 
 
0
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009
28 août 2006 à 13:03
haa oki!Je vois l principe!
J sais pas pourquois j cherche des méthodes toutes faites...

Alors les 2 méthodes proposées sont à mélanger!

J'ai 10item par ligne j vais donc utiliser la boucle

Pour connaitre la ligne, simplement -->

lswCommande.Item(lswCommande.selectedItem).subitem(0).text

et en fait on sélectionne la ligne et avec un bouton updown on la déplace vers le haut ou vers le bas!

Merci a tous pour vos idées!
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
8 sept. 2006 à 14:09
C'est pas ce que fesais mon code ?
(il etait facilement adaptable a ce que tu voulais faire)
@+












http://www.troxsa.info/

Le site qui ne parle qu'un seul langage, visual basic 2005
0
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009
8 sept. 2006 à 21:29
Tu le vois ce doigt?
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
8 sept. 2006 à 22:52
Utilise un DataGridView sa sera beaucoup plus simple, tu peux déplacer des colonnes et des lignes (Par défaut il me semble que les propriétés répondant à ces 2 fonctions sont activées).
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
9 sept. 2006 à 01:01
Doit le prendre plutot mal ce que tu viens de dire là ? "Tu le vois ce doigt? "
La prochaine fois tu sais ou te le foute le doigt quand tu auras besoin d'aide, j'te donne un indice c'est deriere toi au niveau du cul OK !!!!

http://www.troxsa.info/
Le site qui ne parle qu'un seul langage, visual basic 2005
0
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009
9 sept. 2006 à 02:01
Vexouille, je ne me suis pas approproé ton idée merveilleuse que je salue d'ailleurs, mais je ne faisait que contribuer en offrant mes 30 minutes de recherche, de test de commentage et de finition qu'a nécécité la fonction... au cas ou quelqun en aurait besoin,

Alors merci de l'idée mais sur un ton moin audieux ça passe tout de suite mieux

Voila, et soit zen!
0
mrhemp Messages postés 40 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 24 février 2009
9 sept. 2006 à 02:06
Et pour réponse à Willi, mon application fonctionne, pour certains formulaires avec des dataview datagrid dataAdapter etc, et l'autre avec les recodset et des listview classic.

Quand j'ai vu la merde que ca a été (avec vb.net2003) pour mettre en place tout cela, j'ai préferé prendre un listview pour la partie "centrale du programme".

Normalement avec un listview dans VB6 on pouvait faire des drag and drop facielemt d'après ce que j'ai lu, mais cela a disparu avec .net... d'ou le progès...

Merci quand meme pour ta suggestion!
0