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