[VB.NET] Double cliquer sur élément listbox [VB.NET]

Double cliquer sur élément listbox [VB.NET] [VB.NET] - VB/VBA/VBS - Programmation

Marsh Posté le 22-02-2014 à 14:29:52    

  Bonjour,
 
En bon débutant que je suis, je recherche le code pour pouvoir lors de l'exécution de mon appli double cliquer sur un élément de ma lisbox.
 
J'aimerais ouvrir une nouvelle fenêtre lors du double click
 
Pouvez-vous m'aidez?
 
Merci
 

Code :
  1. Public Class Accueil
  2.     Dim ListeDeFilms As New List(Of Films)
  3.     Private Sub Accueil_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.         ListeDeFilms.Add(New Films("Terminator 1", "Action", 1984, "Terminator 1, film d'action de James Cameron" ))
  5.         ListeDeFilms.Add(New Films("Terminator 2", "Action", 1995, "Terminator 2, film d'action de James Cameron" ))
  6.         ListeDeFilms.Add(New Films("Terminator 3", "Action", 1984, "Terminator 3, film d'action de Michael Ferris" ))
  7.         For Each Film As Films In ListeDeFilms
  8.             Liste.Items.Add(Film.Affiche)
  9.         Next
  10.        
  11.     End Sub
  12.     Private Sub Liste_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles Liste.MouseDoubleClick
  13.         If Liste.................. Then
  14.             Consultation.Show()
  15.         End If
  16.     End Sub
  17. End Class

Reply

Marsh Posté le 22-02-2014 à 14:29:52   

Reply

Marsh Posté le 23-02-2014 à 18:00:05    

Dans un premier temps, on peut remplacer le "sender as Object" par "sender as Listbox" (ou le type du controle utilisé),
ça permettra à Visual Studio de t'afficher les bonnes infos sur ton objet
 

Code :
  1. Private Sub Liste_MouseDoubleClick(sender As ListBox, e As MouseEventArgs) Handles Liste.MouseDoubleClick
  2. 'sender représente donc ta listbox, on peut la tester directement plutot que d'appeler "Liste"
  3. 'ensuite, il faut tester si un objet est bien sélectionné dans cette liste, si aucun objet n'est sélectionné, sender.selectedIndex (ou "Liste.selectedIndex" ) vaut -1
  4. if sender.selectedIndex>=0 then
  5. 'enfin plutot que d'appeler directement la fonction "show", on peut appeler une autre fonction avec un argument (le film). Ici, je vais l'appeler "ShowWithArguments"
  6. Consultation.ShowWithArguments(ListeDeFilms(sender.selectedIndex))
  7. end if
  8. end sub


 
Du coup, il faut ajouter une fonction dans ta classe "Consultation":
 

Code :
  1. Public Sub ShowWithArguments(ByRef film as Films)
  2. 'on appelle la fonction show, histoire que le formulaire s'affiche
  3. Show()
  4. 'et avec l'objet "film" en argument tu peux récupérer les infos directement
  5. '(ton code de récupération de données ici)
  6. End Sub


Message édité par Lilleman le 24-02-2014 à 11:52:59
Reply

Marsh Posté le 25-02-2014 à 09:05:00    

Merci celà m'a beaucoup aidé.
Cependant la récupération des informations du film ne marche pas dans consultation j'ai essyé autre chose mais j'ai le même résultat. Je posterais le code

Reply

Marsh Posté le 11-03-2014 à 16:33:30    

Merci celà m'a beaucoup aidé.
Puisque je t'ai sous la main et au lieu de créer un nouveau sujet, j'aimerais une suggestion de ta part sur un problème que j'ai rencontré tout au long de mon programme.
 
En fait j'aimerais lors d'un clic sur un bouton supprimer un film dans laitbox et dans la collection par la même occasion. Le code que j'ai tapé marche partiellement mais à la fin l'appli plante et j'ai une erreur (InvalidOperationException).
Saurais tu ce qui ne va pas?

Code :
  1. Private Sub Supprimer_Click(sender As Object, e As EventArgs) Handles Supprimer.Click
  2.         For Each Film As Films In ListeDeFilms
  3.              Dim Rep As Integer
  4.             If Liste.SelectedItem = Film.Name Then
  5.                 Rep = MsgBox("Voulez-vous vraiment supprimer ce film?", 0, "Confirmation de Suppression" )
  6.                 If Rep = 1 Then
  7.                     Liste.Items.Remove(Liste.SelectedItem)
  8.                     ListeDeFilms.Remove(Film)
  9.                     MsgBox("Votre film a été supprimé", 0, "Confirmation" )
  10.                      MiseAJour()
  11.                 End If
  12.             End If
  13.         Next
  14.     End Sub

Reply

Marsh Posté le 14-03-2014 à 15:51:56    

Le plus gros problème que je vois (qui bloquera l’exécution à coup sûr), c'est que tu essaies de supprimer un élément de la liste de films alors que tu es en train de la parcourir.
La fonction ForEach ne permet pas de faire ça directement, la liste doit contenir le même nombre d'éléments jusqu'à la fin de la boucle.
 
Le code tel que tu l'as fait ici parcourra toute la liste et supprimera tous les films qui ont le même nom que la sélection. Dans le cas où tu veux supprimer un film parce qu'il est en double dans la liste, ça peut poser souci.
De plus, une fois que tu as supprimé l'élément souhaité de la Listbox, Liste.SelectedItem repasse à "Nothing", et le programme n'a plus d'objet pour une comparaison.
Dans ce cas précis (je pars du principe que tu as utilisé le code que tu as posté dans un autre topic), la ListBox devrait contenir le même nombre d'éléments que ListDeFilms, dans le même ordre.
 
Donc, Liste.SelectedIndex correspondra à l'index de l'objet Film dans ListeDeFilms.
 

Code :
  1. Private Sub Supprimer_Click(sender As Object, e As EventArgs) Handles Supprimer.Click
  2. 'on s'assure qu'un élément est sélectionné dans la liste
  3. If Liste.SelectedIndex >= 0 Then
  4.         'On demande la confirmation
  5.         If MsgBox("Voulez-vous supprimer ce film?", MsgBoxStyle.YesNo, "Confirmation de suppression" ) = MsgBoxResult.Yes Then
  6.                 'on supprime l'élément de la liste tant que SelectedIndex vaut quelque chose, puisqu'une fois l'objet supprimé de la ListBox, il repassera à -1
  7.                 ListeDeFilms.RemoveAt(Liste.SelectedIndex)
  8.                 Liste.Items.RemoveAt(Liste.SelectedIndex)
  9.                 'Le fait de mettre une condition ici permet de stopper le programme tant que l'utilisateur n'a pas cliqué sur OK
  10.                 If MsgBox("Le film a été supprimé.", MsgBoxStyle.OkOnly, "Confirmation" ) = MsgBoxResult.Ok Then
  11.                         MiseAJour()
  12.                 End If
  13.         End If
  14.        
  15. End If
  16. End Sub


 
 
Edit: Si tu as trié les films dans la ListBox, mais pas dans ListeDeFilms, cette fonction ne marchera pas.
 
Dans ce cas mieux vaut parcourir la liste pour trouver le film dont le nom correspond.
 

Code :
  1. Private Sub Supprimer_Click(sender As Object, e As EventArgs) Handles Supprimer.Click
  2. 'on s'assure qu'un élément est sélectionné dans la liste
  3. If Liste.SelectedIndex >= 0 Then
  4.         'on parcoure la liste à la recherche du bon film
  5.         For i = (ListeDeFilms.Count-1) To 0 Step -1
  6.                 If ListeDeFilms(i).Name = Liste.SelectedItem Then
  7.                         'On demande la confirmation
  8.                         If MsgBox("Voulez-vous supprimer ce film?", MsgBoxStyle.YesNo, "Confirmation de suppression" ) = MsgBoxResult.Yes Then
  9.                                 'on supprime l'élément des deux listes
  10.                                 ListeDeFilms.RemoveAt(i)
  11.                                 Liste.Items.RemoveAt(Liste.SelectedIndex)
  12.                                 'Le fait de mettre une condition ici permet de stopper le programme tant que l'utilisateur n'a pas cliqué sur OK
  13.                                 If MsgBox("Le film a été supprimé.", MsgBoxStyle.OkOnly, "Confirmation" ) = MsgBoxResult.Ok Then
  14.                                        MiseAJour()
  15.                                 End If
  16.                         End If
  17.                         'Qu'on ai accepté de supprimer ou non, on a trouvé une correspondance, on sort de la boucle
  18.                         i = 0
  19.                 End If
  20.         Next
  21. End If
  22. End Sub


 
Encore une fois, ce code ne posera pas de souci pour supprimer un film, tant que deux films ne portent pas le même nom.
Dans ce cas, je pars du principe que le film en trop est celui qui a été ajouté en dernier, d'où le " For i = (ListeDeFilms.Count-1) To 0 Step -1 " plutôt que  For i = 0 To (ListeDeFilms.Count-1) ".


Message édité par Lilleman le 14-03-2014 à 16:19:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed