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 collection VB NET


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Problème collection VB NET
    Bonjour tout le monde,

    Je suis actuellement bloqué sur un projet en VB.NET que l'on dit faire pour l'école.

    Le projet en quelques mots : Gestion de stocks d'une pharmacie.

    Mon problème : Je dois afficher les stocks disponibles dans un datagridview, on a la possibilité d'envoyer un lot de médicament à une personne. Une fenêtre s'affiche alors avec le choix de l'ID du lot, le visiteur et la date (récupération de l'id et du nom du visiteur dans la bdd)

    Mais j'aimerai supprimer le lot de ma collection (la modification sur la BDD marche bien) :
    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
    Public Sub SupprimeLot(ByVal unId As String, ByVal unVisiteur As String, ByVal laDate As Date)
     
     
            Dim laDateOffre As Date = Now
     
            'Modification
            sqlcom = "UPDATE lot_medicament SET LOT_DATEOFFRE = '" & laDateOffre & "' WHERE LOT_ID = '" & unId & "' "
            Me.openbdd()
            Dim cmd As New MySqlCommand(sqlcom, connexionSql)
            cmd.ExecuteNonQuery()
            MsgBox("Modification effectuée.")
     
            'Suppression dans la collection
            Me.mesLots.RemoveAt(Me.rechercheLot(unId))
     
            sqldr.Close()
        End Sub
    j'utilise une fonction qui renvoie l'indice correspondant à l'id dans la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function rechercheLot(ByVal unId As String) As Integer
            Return Me.mesLots.FindIndex(Function(unLot As Lot)
                                            Return unLot.Lot_Id = unId
                                        End Function)
        End Function
    Lorsque j'exécute le programme, il fais les modifications mais me met une erreur pour la suppression dans la collection :

    L'exception ArgumentOutOfRangeException n'a pas été gérée, l'index était hors limites.


    Il trouve bien l'Id mais n'affiche rien dans la collection

    Et je bloque sur cette erreur depuis un bon moment, si quelqu'un peut m'apporter une solution je suis preneur

    Merci !

  2. #2
    Membre du Club
    Inscrit en
    Février 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 37
    Points : 55
    Points
    55
    Par défaut
    salut,

    ton approche n'est pas mauvaise mais un conseil évite déjà de passer ta fonction rechercheLot en paramètre de la fonction removeAt.
    Si ton élément n'est pas trouvé, ta fonction va te retourner -1 et tu auras cette fameuse erreur.
    Commence par stockée le résultat de ta fonction dans une variable et test si l'index retourné est bien compris dans les bornes d'index de ta collection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim index as integer = Me.rechercheLot(unId)
    if index >=0 and index < Me.mesLots.count then Me.mesLots.RemoveAt(index)
    essaie déjà avec ce bout de code et voit en pas à pas si tu passes dans le removeAt

  3. #3
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Supposant que vous êtes en framework 3.5 min, vous pouvez aussi utiliser .FirstOrDefaultEx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mesLots.FirstOrDefault(Function(UnLot) UnLot.Lot_id= unId) 'retourne l'objet si trouvé, sinon retourne nothing.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  4. #4
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    J'ai essayé chacune de vos solutions,

    @strikel il passe bien dans le removeAt, il ne m'affiche plus l'erreur initiale mais ne supprime pas de la collection, lors du pas à pas il me met dans un petite fenêtre :


    Me.mesLots Count = 0

  5. #5
    Membre du Club
    Inscrit en
    Février 2012
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 37
    Points : 55
    Points
    55
    Par défaut
    ta collection est vide à ce niveau normale que ça plante sur un removeAt.
    mais pas évident de voir d’où vient le problème sans le code de ta classe.
    Ou est déclarée ta variable mesLots ?
    Comment la remplie tu ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Ici je déclare 'mesLots' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private _mesLots As New List(Of Lot)

    Constructeur de la classe Lot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub New(ByVal IdInitial As Integer, ByVal codeMedicamentInitial As String, ByVal IdVisiteurInitial As String, ByVal IdContenirInitial As String,
                   ByVal NomLaboInitial As String, ByVal LibelleInitial As String, ByVal QuantiteInitial As String, ByVal DatePeremptionInitial As Date,
                   ByVal DateOffreInitial As Date, ByVal DateAjoutInitial As Date)
            Me.Lot_Id = IdInitial
            Me.Lot_Code_Medicament = codeMedicamentInitial
            Me.Lot_Id_Visiteur = IdVisiteurInitial
            Me.Lot_Id_Contenir = IdContenirInitial
            Me.Lot_Nom_Labo = NomLaboInitial
            Me.Lot_Libelle = LibelleInitial
            Me.Lot_Quantite = QuantiteInitial
            Me.Lot_DatePeremption = DatePeremptionInitial
            Me.Lot_DateOffre = DateOffreInitial
            Me.Lot_DateAjout = DateAjoutInitial
        End Sub

    Ici je remplie la collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sqlcom = "SELECT * FROM lot_medicament"
            Try
                Dim cmd As New MySqlCommand(sqlcom, connexionSql)
                sqldr = cmd.ExecuteReader
                While sqldr.Read()
                    mesLots.Add(New Lot(sqldr.GetString("LOT_ID"), sqldr.GetString("VIS_ID"), sqldr.GetString("REF_ID"), sqldr.GetString("TYC_CODE"), sqldr.GetString("LAB_NOM"), sqldr.GetString("LOT_LIBELLE"), sqldr.GetString("LOT_QUANTITE"), sqldr.GetString("LOT_DATEPEREMPTION"), sqldr.GetString("LOT_DATEOFFRE"), sqldr.GetString("LOT_DATEAJOUT")))
                End While
                sqldr.Close()
            Catch ex As Exception
            End Try

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour

    D'abor Collection(of t) ou List(of t),c'est toltalement flou...
    Si ta liste est bindee par dgv.datasource=Lot,le binding interdit de supprimer un element...

    Il faut acceder à la liste sous-jacente via bindingsource :

    exemple code .vb
    1/class medicaments et list(of medicaments)
    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
     
    Imports System.Collections.Generic
    Public Class Medicaments
        Public Sub New(ByVal code As String, ByVal n As String)
            ID = code
            Name = n
        End Sub
        Public Property ID As String
        Public Property Name As String
     
    End Class
    Public Class Lot
        Inherits List(Of Medicaments)
        Private md As Medicaments
        Public Sub New()
            For index = 1 To 10
                md = New Medicaments("code" + index.ToString, "medicament" + index.ToString)
                Me.Add(md)
            Next
     
        End Sub
    End Class
    code du form avec un dgv lie ,textbox lie et 2 buttons de suppressions
    -le 1er leve une exception car il accede a collection sauvagement mais oublie que le chien de garde bindingsource veille au grain)
    -le 2eme demande l'accord du chien de garde et reussit à supprimer l'objet

    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
     
     
    Public Class frmMedicaments
        Private lot As New Lot
        Private myBinding As BindingSource
        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            myBinding = New BindingSource
            myBinding.DataSource = lot
     
            DataGridView1.DataSource = myBinding
            TextBox1.DataBindings.Add("Text", myBinding, "ID", True, DataSourceUpdateMode.OnPropertyChanged)
     
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'ce code declenche une sale exception
            Dim id As String = TextBox1.Text
            If id = "code9" Then
                lot.RemoveAt(myBinding.Position)
            End If
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            'ce code est l'ami de bindingsource
            Dim id As String = TextBox1.Text
            If id = "code9" Then
                myBinding.RemoveAt(myBinding.Position)
            End If
        End Sub
    End Class
    bon code....

Discussions similaires

  1. Probléme avec asp.net et requete sql
    Par locs dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/02/2007, 20h26
  2. Problème configuration ASP.NET 2.0 avec serveur IIS
    Par pstarnaud dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/01/2007, 00h19
  3. Problème benchmark Microsoft .NET / Mono, et C#
    Par G-FACTION dans le forum Mono
    Réponses: 2
    Dernier message: 11/12/2006, 08h21
  4. Probléme collection d'objets
    Par Contrec dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 11h08
  5. problème collection TABLE
    Par venusiafalls dans le forum SQL
    Réponses: 6
    Dernier message: 28/04/2004, 17h48

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