List Generics [Résolu]

Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
- - Dernière réponse : NSUADI
Messages postés
540
Date d'inscription
mardi 4 août 2009
Dernière intervention
1 février 2013
- 10 févr. 2012 à 12:12
Bonjour,

Je ne suis pas tres a l'aise avec les generics.

Voila ce que j'ai en declaration dans ma Form de base:
    ' Generic List => http://visualbasic.about.com/od/usingvbnet/a/genericlist_2.htm (Lien interessant!)
    Private myDataList As New List(Of myDynamicData)
    Private myCounter As Integer

Avec la classe simplifiee:
Public Class myClass
    Public Data1 As Integer
    Public Data2 As String
    Public Data3 As String
    Public Sub New(ByVal m_Data1  As Integer, ByVal m_Data2 As String, ByVal m_Data3 As String)
        Data1 = m_Data1 
        Data2 = m_Data2 
        Data3 = m_Data3
    End Sub

Et enfin, dans une Sub ou j'ajoute des donnees:
    myDataList.Add(New myDynamicData(myCounter , "String1", "String2"))

Bon, l'addition marche correctement, puisque le code suivant dans une Sub marche tres bien:
    myDataList.ForEach(AddressOf addingObjectInListBox)

Ce qui ajoute des donnees dans une ListBox avec le code suivant:
Private Sub addingObjectInListBox(ByVal t As myDynamicData)
    myListBox.Items.Add(t.Data1 & " " & t.Data2)
End Sub

Bon, en esperant avoir ete clair sur ce que je fais, voila 2 questions:
1- Comment fais-t-on pour enlever une ligne de cette List?
(Remove(i) ou RemoveAt(i) n'a pas marche avec moi)
2- J'ai cree un genre d'index (via myCounter), est-ce necessaire pour trouver la ligne voulu?

Le mieux pour moi serait d'avoir un exemple simple que je pourrais essaye de decortiquer, mais je n'ai rien trouve sur internet qui ressemble un peu a ce que j'essaye de faire: creer une List d'un Objet avec 3 parametres et pouvoir manipuler cette List (entre autre enlever une ligne bien definie).

Merci,
JLuc01
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
540
Date d'inscription
mardi 4 août 2009
Dernière intervention
1 février 2013
2
3
Merci
Après grosse réflexion,j'ai finalement trouvé le hic ... je vais essayer de faire le plus claire possible car je devrais être entrain de dormir donc je suis pas très lucide tu m'excuseras donc si c'est pas très clair!!

alors quand tu fais:
        ' 1)Remove a selected Item from the ListBox
        myListBox.Items.Remove(myListBox.SelectedItem)
        ' 2)Remove a selected Item from the Generic List
        myDataList.Remove(DirectCast(myListBox.SelectedItem, myDataObject))


lorsque la 1ère instruction s'exécute,ça veut dire que tu effaces l'élément sélectionné de ta liste,on est bien d'accord,le problème c'est que lorsqu'on passe à la seconde instruction il n'y a plus de "SelectedItem" donc tu n'effaces rien dans ta liste ...
une solution serait de capter l'index de l'élément,de ce fait l'index serait conservé bien au chaud et l'élément concerné peut donc être effacé de la liste:

 ' STEP2: Remove a selected Item from the Generic List and also the ListBox
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' 1)Remove a selected Item from the ListBox
        Dim index As Integer = myListBox.SelectedIndex
        myListBox.Items.RemoveAt(index)
        ' 2)Remove a selected Item from the Generic List
        myDataList.RemoveAt(index)
       
    End Sub


et voilà le tour est joué!!

Bonne continuation!! et surtout bonne nuit!!

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NSUADI
3
Merci
Bonsoir,

Tu peux te servir de la méthode Find puisque Data1 est un index apparement :
'effacement
myIndex = 1
'récupération de l'objet par la méthode find
Dim myObject As myDynamicData = myDataList.Find(AddressOf findObject)
'effacement dans la listbox
myListBox.Items.RemoveAt(myIndex)
'effacement dans la list(of...)
myDataList.Remove(myObject)


Avec le code de la fonction :
Private Function findObject(ByVal t As myDynamicData) As Boolean
    If t.Data1 = myIndex Then Return True Else Return False
End Function


Bien sûr myIndex devra être déclaré :
Private myIndex As Integer


Bonne soirée.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

Tu peux ajouter directement l'objet et utiliser une réécriture de la méthode ToString pour changer l'affichage :

Public Overrides Finction ToString() As String
Return "MaLigne"
End Function

Et pour supprimer, tu utiliseras Remove et l'objet à supprimer.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
OK, si je comprend bien, quelquechose comme:

Public Overrides Function ToString(ByVal t As myDynamicData) As String
Dim myLine As String
myLine = t.Data1 & "," & t.Data2 & "," & t.Data3
Return myLine 
End Function


Et pour supprimer, quelquechose comme:

myDataList.ToString.Remove(2) 'Pour enlever la ligne 3 ???


Franchement pas sur de ce que j'ecris.
Bon, j'essayerai d'approfondir...

A+
JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

Oui, pour le ToString, sinon pour le Remove, tu peux directement utiliser l'objet :

ListBox1.Items.Add(MonObjet)

ListBox1.Items.Remove(MonObjet)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
Bonjour Henry,

C'est pas tres clair tout ca...
De plus, je ne peux pas utiliser 'Overrides' dans la fonction 'ToString', ou bien cette fonction n'est pas placee au bon endroit.

Bref, j'ai refait un petit projet facile a utiliser avec une ListBox et 4 Boutons, pour essayer d'etre plus clair.
Je coince au niveau du Bouton2.
Voila le code:

Public Class Form1
    Private myDataList As New List(Of myDataObject)
    Private myCounter As Integer

    ' STEP1: Add a list in the Generic List and in the ListBox 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        myCounter = myCounter + 1
        If myCounter > 12 Then Exit Sub
        myListBox.Items.Clear() ' Reset the ListBox
        myDataList.Add(New myDataObject(myCounter, "String" & Chr(64 + myCounter), "String2"))
        myDataList.ForEach(AddressOf addingObjectInListBox)
    End Sub

    ' STEP2: Remove a selected Item from the Generic List and also the ListBox
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' 1)Remove a selected Item from the ListBox
        myListBox.Items.Remove(myListBox.SelectedItem)
        ' 2)Remove a selected Item from the Generic List
        Dim obj As myDataObject = myDataList.Item(myListBox.SelectedIndex).ToString() ' <= ???
        myDataList.Remove(obj)
    End Sub

    ' STEP3: Clear the ListBox
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        myListBox.Items.Clear()
    End Sub

    ' STEP4: Reload the Generic List in the ListBox
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        myDataList.ForEach(AddressOf addingObjectInListBox)
    End Sub

    Private Sub addingObjectInListBox(ByVal t As myDataObject)
        myListBox.Items.Add(t.Data1 & " " & t.Data2)
    End Sub

    ' Function 'ToString' cannot be declared 'Overrides' because it does not override a function in a base class
    Public Overloads Function ToString(ByVal t As myDataObject) As String
        Dim myLine As String
        myLine = t.Data1 & "," & t.Data2 & "," & t.Data3
        Return myLine
    End Function

End Class

Public Class myDataObject
    Public Data1 As Integer
    Public Data2 As String
    Public Data3 As String

    Public Sub New(ByVal m_Data1 As Integer, ByVal m_Data2 As String, ByVal m_Data3 As String)
        Data1 = m_Data1
        Data2 = m_Data2
        Data3 = m_Data3
    End Sub

End Class


Si tu peux m'expliquer mon erreur... parce que pour l'instant je rame...
Merci,

JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

Public Class myDataObject
Public Data1 As Integer
Public Data2 As String
Public Data3 As String

Public Sub New(ByVal m_Data1 As Integer, ByVal m_Data2 As String, ByVal m_Data3 As String)
Data1 = m_Data1
Data2 = m_Data2
Data3 = m_Data3
End Sub

Public Overrides Function ToString() As String
Dim myLine As String
myLine = t.Data1 & "," & t.Data2 & "," & t.Data3
Return myLine
End Function
End Class


myListBox.Items.Add(New myDataObject(myCounter, "String" & Chr(64 + myCounter), "String2"))

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
Bonjour,

Effectivement, c'est plus logique d'avoir la fonction dans la classe.

Le code est actuellement le suivant (sans t, puisqu'on est dans la classe):
Public Overrides Function ToString() As String
     Dim myLine As String
     myLine =   Data1 & "," & Data2 & "," & Data3
     Return myLine
End Function


Mais cela ne resoud pas le principal probleme sur le Bouton2 .
C'est a dire:
1- Enlever un Item selectionne de la ListBox => OK
2- Enlever le meme Item de la List Generic => NE MARCHE PAS!!

Le bouton3 qui enleve tout de la ListBox et le Bouton4 qui recharge la ListBox le prouve.

Merci malgre tout pour ta perseverance,
JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
14397
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
23 mars 2019
154
0
Merci
Bonjour,

myDataList.Remove(directcast(myListBox.SelectedItem,myDataObject ))
myListBox.Items.Remove(myListBox.SelectedItem)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
Cela n'enleve rien a la List Generic...
myDataList.Remove(DirectCast(myListBox.SelectedItem, myDataObject)) 


JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
264
0
Merci
Bonjour,
je te rappelle ceci de ton code :
 myListBox.Items.Add(t.Data1 & " " & t.Data2)

Qui donne à penser que ta listbox n'est pas liée
Et il me semble que ceci :
myDataList.Remove(DirectCast(myListBox.SelectedItem, myDataObject)) 

ne "touche" pas aux articles de ta listbox, mais à le table utilisée.
Qu'as-tu fait de ce qui me parait "toucher" à la listbox elle-même, à savoir ce que t'as dit NHenry :
myListBox.Items.Remove(myListBox.SelectedItem) 

?
Mais bon ... je ne connais personnellement rien à VB.Net ! Je me contente d'essayer de comprendre les effets d'une ligne de code et ceux de l'autre. Les deux. Et ils me paraissent à la fois distincts et complémentaires ("touchant" à deux "choses").
Me trompe-je ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
Ucfoutu, oui c'est deux choses differentes.
Nhenry, ta logique me parait bonne, mais cela ne marche pas.
Ou bien, il y a quelquechose qui m'echappe.

OK, j'essaye de re-expliquer avec plus de details.
Premierement, voila le code ci-dessous, legerement retouche par rapport au debut (pour essayer de simplifier et d'aller droit au but a mon objectif).
=> objectif: enlever une ligne de la ListBox (myListBox) + enlever la meme ligne se situant dans ma List (myDataList) - voir Bouton2.
=> Exemple comprenant une ListBox et 4 Boutons, que je fais marcher l'un apres l'autre pour voir l'effet du Bouton2.
1- STEP1, j'ajoute 10 lignes par exemple
2- STEP2, j'enleve la ligne 5 par exemple
3- STEP3, j'enleve tout de la ListBox
4- STEP4, je recharge la ListBox (via ma List myDataList), qui devrait montrer dans le cas present 9 lignes (ligne 5 absente)

Le code:
Public Class Form1
    Private myDataList As New List(Of myDataObject)
    Private myCounter As Integer

    ' STEP1: Add a list in the Generic List and in the ListBox 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        myCounter = myCounter + 1
        If myCounter > 12 Then Exit Sub
        myListBox.Items.Clear() ' Reset the ListBox
        myDataList.Add(New myDataObject(myCounter, "String" & Chr(64 + myCounter)))', "String2"))
        myDataList.ForEach(AddressOf addingObjectInListBox)
    End Sub

    ' STEP2: Remove a selected Item from the Generic List and also the ListBox
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' 1)Remove a selected Item from the ListBox
        myListBox.Items.Remove(myListBox.SelectedItem)
        ' 2)Remove a selected Item from the Generic List
        myDataList.Remove(DirectCast(myListBox.SelectedItem, myDataObject))
    End Sub

    ' STEP3: Clear the ListBox
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        myListBox.Items.Clear()
    End Sub

    ' STEP4: Reload the Generic List in the ListBox
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        myDataList.ForEach(AddressOf addingObjectInListBox)
    End Sub

    Private Sub addingObjectInListBox(ByVal t As myDataObject)
        myListBox.Items.Add(t.Data1 & " " & t.Data2)
    End Sub

End Class

Public Class myDataObject
    Public Data1 As Integer
    Public Data2 As String
    'Public Data3 As String

    Public Sub New(ByVal m_Data1 As Integer, ByVal m_Data2 As String) ', ByVal m_Data3 As String)
        Data1 = m_Data1
        Data2 = m_Data2
        ' Data3 = m_Data3
    End Sub

    Public Overrides Function ToString() As String
        Dim myLine As String
        myLine = Data1 & " " & Data2 '& " " & Data3
        Return myLine
    End Function

End Class


En esperant etre assez clair.
A+

JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
540
Date d'inscription
mardi 4 août 2009
Dernière intervention
1 février 2013
2
0
Merci
Bonsoir,

Bizarre bizarre!!
j'ai testé ton bout de code et c'est le même comportement que ce que tu décris alors qu'avec un exemple simple exemple avec une liste de string,tout se passe sans soucis!!

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Commenter la réponse de NSUADI
Messages postés
208
Date d'inscription
samedi 17 janvier 2009
Dernière intervention
5 mars 2013
1
0
Merci
Bonjour,

Nsuadi, Ton code ne marche pas (enfin, il devrait marcher avec un peu d'adaptation), mais tu as pointe exactement sur le probleme.
Banana32, Merci, ca marche presque comme je veux en adaptant un peu, mais en tout cas, c'est certainement la facon de proceder.
Je sais maintenant ou je vais avec mon code que je vais pouvoir adapter a quelquechose d'un peu plus important.

Merci a tout ceux qui ont participe a cette discussion, cela m'a permis de faire des progres en POO avec Generic List, meme si le chemin est encore assez long.

Un exces de 'smiley face' pour montrer ma joie.

JLuc01
Commenter la réponse de cs_JLuc01
Messages postés
540
Date d'inscription
mardi 4 août 2009
Dernière intervention
1 février 2013
2
0
Merci
Salut,

mon code ne marche pas?!!!
et pourtant chez moi,ça marche parfaitement avec le bout de code que tu nous a fourni ... mais bon l'essentiel est que tu aies réussi à trouver ce qui posait problème.

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Commenter la réponse de NSUADI

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.