IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[vb2005] problème avec list.remove


Sujet :

VB.NET

  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [vb2005] problème avec list.remove
    Bonjour à tous,

    Dans une de mes classes (user.vb), j'ai le bout de code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
        Private _laptops As List(Of Laptop)
        Public Property Laptops() As List(Of Laptop)
            Get
                Return _laptops
            End Get
            Private Set(ByVal value As List(Of Laptop))
                _laptops = value
            End Set
        End Property
    
        Public Sub AddLaptop(ByVal laptop As Laptop)
            If Not Me.Contains(laptop) Then
                If LaptopDAO.UpdateLaptop(laptop, Me.Username, "update") Then
                    _laptops.Add(laptop)
                Else
                    MessageBox.Show(messLaptopErrorAdd, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
                End If
            Else
                MessageBox.Show(messLaptopAlreadyExists, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
    
        Public Sub RemoveLaptop(ByVal laptop As Laptop)
            If Me.Contains(laptop) Then
                If LaptopDAO.UpdateLaptop(laptop, "", "detach") Then
                    _laptops.Remove(laptop)
    
                End If
            Else
                MessageBox.Show(messLaptopNotFound, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
    
        Public Function GetLaptop(ByVal serial As String) As Laptop
            For Each laptop As Laptop In _laptops
                If laptop.Serial = serial Then
                    Return laptop
                End If
            Next
            Return Nothing
        End Function
    Comme vous le voyez, un user peut posséder plusieurs laptops. Il y a une méthode pour en obtenir un, en ajouter un et en retirer un.

    J'aurais voulu votre avis concernant la méthode RemoveLaptop.
    J'ai un doute concernant la ligne "_laptops.Remove(laptop)" (celle en rouge).

    Lors de l'appel à cette méthode, je récupère bien l'objet en question en utilisant la méthode GetLaptop mais j'ai l'impression que quelque chose se passe de travers durant la méthode RemoveLaptop.

    En effet, j'affiche les différents laptop d'un user dans une combobox (uniquement le numéro de série). Au départ, tout se passe bien. Après un ajout, tout se passe bien également. Après un remove, à place des valeurs attendues, j'ai "usermanagement.laptop".

    C'est grave docteur ?

    Merci d'avance.

    Griftou.

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Peux-tu poster le code du bind de ta liste de laptop et la combobox ?
    Et le code qui appelle le Remove.

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Le code qui lie les deux est vraiment tout ce qu'il y a de plus simple. Ca donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    combobox.displaymember = "Serial"
    combobox.valuemember = "Serial"
    combobox.datasource = user.laptops

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Que contient _laptops juste après _laptops.Remove(laptop) ?

    Le laptop n'est plus présent ?

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Justement, c'est pour ça que je ne comprends. Quand je fais tourner le programme en mode step by step et que je vérifie moi même dans VS à chaque étape le contenu de mes variables, tout est correct.

    J'ai la même chose avec la liste des gsm's et des clés vpn... (logique, vu que c'est le même code ^^).

    Encore une chose intéressante aussi. J'ai un controle de type DataGridView qui reçoit la même source de données que la combobox (histoire de voir le détail et pas juste le numéro de série). Dans ce controle, ça marche nickel...

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Est-ce que le displaymember et le valuemember est toujours renseigné avant et après le remove ?

  7. #7
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    A chaque fois que je modifie la source de données, je réaffecte tout ce qui concerne le binding histoire d'être sûr (en n'oubliant d'assigner nothing au datasource avant de faire les modifs)

    Pour plus de détails, il y a ce topic que j'avais créé au début.

    Depuis je pense avoir mieux localisé la source du problème donc j'en ai fait un nouveau car le précédent semblait un peu indigeste...

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    J'ai fait un petit test qui fonctionne parfaitement :

    Une form avec deux combo et un bouton pour supprimer un laptop sur un user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Public Class Form1
     
        Private Sub cbUsers_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbUsers.SelectedIndexChanged
            Dim user As User = cbUsers.SelectedItem
     
            cbLaptop.DataSource = user.Laptops
            cbLaptop.DisplayMember = "Serial"
        End Sub
     
        Private Sub btnRemoveLapTop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemoveLapTop.Click
            Dim user As User = cbUsers.SelectedItem
            Dim laptop As LapTop = cbLaptop.SelectedItem
     
            user.RemoveLaptop(laptop)
            cbLaptop.DataSource = Nothing
            cbLaptop.DataSource = user.Laptops
            cbLaptop.DisplayMember = "Serial"
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim users As New List(Of User)
     
            For i As Integer = 0 To 25
                Dim user As New User()
                user.Name = i.ToString()
                For j As Integer = 0 To 10
                    Dim laptop As New LapTop()
                    laptop.Serial = "Serial-" & i & "-" & j
                    user.AddLaptop(laptop)
                Next
                users.Add(user)
            Next
     
            cbUsers.DataSource = users
            cbUsers.DisplayMember = "Name"
        End Sub
    End Class
    Mes classes user et laptop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Public Class User
        Private _name As String
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property
     
        Private _laptops As New List(Of LapTop)
        Public Property Laptops() As List(Of LapTop)
            Get
                Return _laptops
            End Get
            Private Set(ByVal value As List(Of LapTop))
                _laptops = value
            End Set
        End Property
     
        Public Sub AddLaptop(ByVal laptop As LapTop)
            If Not _laptops.Contains(laptop) Then
                'If LaptopDAO.UpdateLaptop(laptop, Me.Username, "update") Then
                _laptops.Add(laptop)
                'Else
                '    MessageBox.Show(messLaptopErrorAdd, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
                'End If
            Else
                'MessageBox.Show(messLaptopAlreadyExists, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
     
        Public Sub RemoveLaptop(ByVal laptop As LapTop)
            If _laptops.Contains(laptop) Then
                'If LaptopDAO.UpdateLaptop(laptop, "", "detach") Then
                _laptops.Remove(laptop)
     
                'End If
            Else
                'MessageBox.Show(messLaptopNotFound, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
     
        Public Function GetLaptop(ByVal serial As String) As LapTop
            For Each laptop As LapTop In _laptops
                If laptop.Serial = serial Then
                    Return laptop
                End If
            Next
            Return Nothing
        End Function
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class LapTop
        Private _serial As String
        Public Property Serial() As String
            Get
                Return _serial
            End Get
            Set(ByVal value As String)
                _serial = value
            End Set
        End Property
     
    End Class

  9. #9
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je vois que tu as mis la ligne d'assignation de la propriété datasource avant les lignes members (value et display).

    Il me semble avoir lu (il y a longtemps^^) qu'il fallait mettre datasource après.

    Quoi qu'il en soit, j'ai essayé en mettant la ligne avec datasource avant.
    Dans ce cas, quand je déroule la combobox, j'ai bien la valeur voulue mais, quand je clique sur un record se trouvant dans le controle datagridview (ce qui provoque le changement de record dans la combobox aussi puisqu'il s'agit de la même source), j'ai de nouveau le type de la variable plutot que le contenu...

    Chose "amusante", avec mon code initial, j'ai le type dans la combobox mais quand je choisis un record dans la grille, la combobox affiche la valeur

  10. #10
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Tu peux poster le code correspondant au datagridview_Click, là où tu affectes la combo

  11. #11
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    je n'ai aucun code dans cet évènement.

    vu que j'affecte le même objet comme datasource de la grille et de la combo, quand tu changes dans l'un, ça change automatiquement dans l'autre.

  12. #12
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Ah ben le code de ça alors !

  13. #13
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par griftou Voir le message
    Le code qui lie les deux est vraiment tout ce qu'il y a de plus simple. Ca donne ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    combobox.displaymember = "Serial"
    combobox.valuemember = "Serial"
    combobox.datasource = user.laptops
    Voilà ^^

    Et sinon pour le DataGridView bien ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dgv.datasource = nothing
    dgv.datasource = user.laptops
    Ou alors je n'ai pas compris à quel code tu fais allusion

  14. #14
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Euh tu fais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    combobox.datasource = Nothing
    combobox.displaymember = "Serial"
    combobox.valuemember = "Serial"
    combobox.datasource = user.laptops

  15. #15
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    oui oui bien sûr.

    j'avais retappé ce code manuellement (la machine de développement n'est pas sur le même réseau que celle depuis laquelle j'écris). J'avais donc oublié une ligne.

    Ca change quelque chose au problème ? :-/

  16. #16
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Ne voyant pas le problème, le plus simple est peut-être de reprendre si un exemple simple tel que le mien.

Discussions similaires

  1. [SQL] Problème avec liste déroulante et select
    Par cari dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/07/2006, 21h52
  2. Problème avec listes déroulantes
    Par dl_jarod dans le forum Langage
    Réponses: 9
    Dernier message: 07/06/2006, 11h13
  3. Réponses: 20
    Dernier message: 22/03/2006, 15h00
  4. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 22h04
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo