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 :

problème d'objets dans un datasource


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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut problème d'objets dans un datasource
    Bonjour tout le monde.

    J'ai un bug que je ne comprends pas...

    C'est quelque chose qui marche bien plusieurs fois puis après une action précise, ça ne marche plus ^^.

    Jetez d'abord un oeil à la pièce jointe (gui.jpg). Il s'agit d'un formulaire listant les différents devices (gsm, laptop et carte vpn) en possession d'un user. Il permet également d'en faire la gestion. (Formulaire qui s'intègre dans une application de user management).

    Voici une sub qui est appelée lors de l'event CheckedChanged des RadioButton en haut de la form (cfr. pièce jointe).

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Private Sub InitGroupBox(ByVal device As String)
            Select Case device
                Case "rbGsm"
                    dgvDevice.DataSource = Nothing
                    dgvDevice.DataSource = user.Gsms
                    dgvDevice.Columns("SimCard").Visible = False
     
                    gbDelDevice.Text = "Retirer un gsm de ce user"
                    lblDelDevice.Text = "Liste des gsm's de ce user"
                    cbDelDevice.DataSource = Nothing
                    cbDelDevice.DisplayMember = "Imei"
                    cbDelDevice.ValueMember = "Imei"
                    cbDelDevice.DataSource = user.Gsms
     
                    gbAddDevice.Text = "Attribuer un gsm à ce user"
                    lblAddDevice.Text = "Liste des gsm's disponibles"
     
                    cbAddDevice.DataSource = Nothing
                    cbAddDevice.DisplayMember = "Imei"
                    cbAddDevice.ValueMember = "Imei"
                    cbAddDevice.DataSource = GsmDAO.GetFreeGsms()
     
                    gbEditDevice.Text = "Modifier un gsm de ce user"
                    lblEditDevice.Text = "Liste des gsm's de ce user"
                    cbEditDevice.DataSource = Nothing
                    cbEditDevice.DisplayMember = "Imei"
                    cbEditDevice.ValueMember = "Imei"
                    cbEditDevice.DataSource = user.Gsms
                Case "rbLaptop"
                    dgvDevice.DataSource = user.Laptops
     
                    gbDelDevice.Text = "Retirer un laptop de ce user"
                    lblDelDevice.Text = "Liste des laptops de ce user"
                    cbDelDevice.DataSource = Nothing
                    cbDelDevice.DisplayMember = "Serial"
                    cbDelDevice.ValueMember = "Serial"
                    cbDelDevice.DataSource = user.Laptops
     
                    gbAddDevice.Text = "Attriber un laptop à ce user"
                    lblAddDevice.Text = "Liste des laptops disponibles"
                    cbAddDevice.DataSource = Nothing
                    cbAddDevice.DisplayMember = "Serial"
                    cbAddDevice.ValueMember = "Serial"
                    cbAddDevice.DataSource = LaptopDAO.GetFreeLaptops()
     
                    gbEditDevice.Text = "Modifier un gsm de ce user"
                    lblEditDevice.Text = "Liste des laptops de ce user"
                    cbEditDevice.DataSource = Nothing
                    cbEditDevice.DisplayMember = "Serial"
                    cbEditDevice.ValueMember = "Serial"
                    cbEditDevice.DataSource = user.Laptops
                Case "rbVpn"
                    dgvDevice.DataSource = user.Vpns
     
                    gbDelDevice.Text = "Retirer un carte vpn de ce user"
                    lblDelDevice.Text = "Liste des cartes vpn de ce user"
                    cbDelDevice.DataSource = Nothing
                    cbDelDevice.DisplayMember = "Serial"
                    cbDelDevice.ValueMember = "Serial"
                    cbDelDevice.DataSource = user.Vpns
     
                    gbAddDevice.Text = "Attribuer une carte vpn à ce user"
                    lblAddDevice.Text = "Liste des cartes vpn disponibles"
                    cbAddDevice.DataSource = Nothing
                    cbAddDevice.DisplayMember = "Serial"
                    cbAddDevice.ValueMember = "Serial"
                    cbAddDevice.DataSource = VpnDAO.GetFreeVpns()
     
                    gbEditDevice.Text = "Modifier une carte vpn de ce user"
                    lblEditDevice.Text = "Liste des cartes vpn de ce user"
                    cbEditDevice.DataSource = Nothing
                    cbEditDevice.DisplayMember = "Serial"
                    cbEditDevice.ValueMember = "Serial"
                    cbEditDevice.DataSource = user.Vpns
            End Select
        End Sub
    Au load de la form, j'initialise les radiobutton avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Private Sub frmDevices_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            rbGsm.Checked = True
        End Sub
    Ce qui me pose problème ne concerne que les gsm's (rien n'est encore implémenté pour les autres devices). Cela marche très bien quand j'ajoute un gsm. Par contre, quand je retire un gsm du user, le gsm disparait bien du datagridview et l'update DB est correctement effectué mais il y a un manifestement un problème (voir pièce jointe prob.jpg). C'est pourtant le même code qui est exécuté à chaque fois.

    Pourquoi est-ce que lors de la suppression, il ne m'affiche plus la liste encore existante ?
    De plus, lorsque je clique sur le record du DataGridView, l'imei du gsm s'affiche bien dans la ComboBox. Il a donc bien la liste en DataSource. Mais lorsque je déroule la ComboBox, il y a toujours "UserManagement.Gsm" qui s'affiche plutot que la valeur attendue.

    Bref, c'est la première fois que je travaille vraiment avec mes propres objets et je suis un peu perdu sur la manière de résoudre ce problème.

    J'espère avoir été clair :-/

    Merci d'avance,

    Griftou.
    Images attachées Images attachées   

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Je pense qu'il faudrait plutôt afficher le code de la "suppression" d'un GSM.

    Celui qui te pose problème....

  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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je ne pensais pas que cela venait de là mais voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click
            If cbDelDevice.SelectedIndex <> -1 Then
                Select Case selectedDeviceType
                    Case "rbGsm"
                        user.RemoveGsm(user.GetGsm(cbDelDevice.SelectedValue))
                        Me.InitGroupBox("rbGsm")
                End Select
            End If
        End Sub
    Du coup, je suppose qu'il faut le code de RemoveGsm. Le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Public Sub RemoveGsm(ByVal gsm As Gsm)
            If Me.Contains(gsm) Then
                If GsmDAO.UpdateGsm(gsm, "", "detach") Then
                    _gsms.Remove(gsm)
                End If
            Else
                MessageBox.Show(messGsmNotFound, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
    La fonction updategsm qui se trouve dans gsm dao est un simple update db avec des paramètres pour savoir quoi updater. Donc pas de souci à ce niveau là --> je ne vous ennuie pas avec ce code là.

    Bref, je pense vraiment que le problème vient de je donne dans la propriété datasource de la combobox.

    Donc si je cherche la cause de ce qui merde dans cette variable, ça devrait venir de la classe User. Mais je ne vois pas ce qui cloche dans cette classe concernant les gsm...

    Voici ce qui concerne les gsm dans cette classe

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
        Private _gsms As List(Of Gsm)
        Public Property Gsms() As List(Of Gsm)
            Get
                Return _gsms
            End Get
            Private Set(ByVal value As List(Of Gsm))
                _gsms = value
            End Set
        End Property
     
        ''' <summary>
        ''' Gets the GSM corresponding to the given imei or nothing if not found.
        ''' </summary>
        ''' <param name="imei"></param>
        ''' <returns>Gsm or nothing if not found</returns>
        ''' <remarks></remarks>
        Public Function GetGsm(ByVal imei As String) As Gsm
            For Each elem As Gsm In _gsms
                If elem.Imei = imei Then
                    Return elem
                End If
            Next
            Return Nothing
        End Function
     
        ''' <summary>
        ''' Store a gsm for this user into the database
        ''' </summary>
        ''' <param name="gsm"></param>
        ''' <remarks></remarks>
        Public Sub AddGsm(ByVal gsm As Gsm)
            If Not Me.Contains(gsm) Then
                If GsmDAO.UpdateGsm(gsm, Me.Username, "update") Then
                    _gsms.Add(gsm)
                Else
                    MessageBox.Show(messGsmErrorAdd, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
                End If
            Else
                MessageBox.Show(messGsmAlreadyExists, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
     
        Public Sub RemoveGsm(ByVal gsm As Gsm)
            If Me.Contains(gsm) Then
                If GsmDAO.UpdateGsm(gsm, "", "detach") Then
                    _gsms.Remove(gsm)
                End If
            Else
                MessageBox.Show(messGsmNotFound, titleError, MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
     
        'normalement, pas utilisé
        Public Sub UpdateGsm(ByVal gsm As Gsm)
            Me.RemoveGsm(Me.GetGsm(gsm.Imei))
            Me.AddGsm(gsm)
        End Sub
     
        Public Function Contains(ByVal gsm As Gsm) As Boolean
            For Each elem As Gsm In _gsms
                If elem.Imei = gsm.Imei Then
                    Return True
                End If
            Next
            Return False
        End Function
    Voilà, je crois que je ne saurais pas être plus complet que cela...

  4. #4
    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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Enfin bon, je pense pas qu'il soit nécessaire de parcourir tout ce code..

    Je crois vraiment que le problème vient de la sub InitGroupbox...

Discussions similaires

  1. [Débutant] Problème ajout objet dans fichier xml.
    Par Vidou12 dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/02/2015, 12h36
  2. [Débutant] Problème suppression objet dans une collection
    Par ziggy76 dans le forum VB.NET
    Réponses: 2
    Dernier message: 11/03/2014, 23h16
  3. Problème d'objets dans un TStrings
    Par microJaP dans le forum Langage
    Réponses: 16
    Dernier message: 01/03/2008, 09h36
  4. Réponses: 8
    Dernier message: 12/04/2007, 11h32
  5. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49

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