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 :

boucle sur un objet


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut boucle sur un objet
    bonjour a tous, je suis en train de developpez une petite application en vb.net, et je suis confronté a un probleme depuis quelques jours. voila, j'ai une collection (nommé intelligement collection ici), et des objets (ligne)
    Je souhaite entrer les lignes dans ma collection a l'aide d'une boucle for. ces lignes depandent d'un interger (i), selon i, la ligne change.
    La connection, me permet de me connecter a un fichier, et le chemin est le chemin de ce fichier.
    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
     
    test = New Ligne
    test.connection(chemin)
     
    'instanciation de la collection
    tableau = New CollectionDeLigne
     
    'recuperation du nombre de lignes contenu dans le tableau
    compte = test.nbre_de_ligne()
     
        For i = 2 To compte
     
            'je rempli mon objet avec les donnée du tableau (je ne le fait pas dans le constructeur, sinon j'ai une erreur)
            test.remplissage(i)
     
            'j'ajoute la ligne a ma collection
            tableau.add(test)
     
            'je vide mon objet
            test = Nothing
     
        Next
     
    'j'affiche les données de ma collection
    tableau.affichage()
     
    'je ferme ma connection
    test.fermeture_connection()
    Si quelqu'un peu me donner une piste de reflection, j'en serait plus que ravi.merci beaucoup

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut
    (une fausse manip....j'ai pas eu le temps de poser mon probleme dans le post precedent... )

    le probleme est que dans ma collection, il n'y a pas plusieur objet différents, mais plusieurs objet qui ont les meme attributs.....ils sont tous identiques.

    merci

  3. #3
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    J'ai rien compris

  4. #4
    Membre expérimenté Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour,
    En fait tu as un problème avec la "philosophie objet" dans ce cas là.
    Je m'explique :
    Tu as une instance d'un objet (que tu as appelé test) tu l'initialise au début de ton code.
    Ensuite dans chaque tour de ta boucle tu utilises la méthode remplissage() de cet objet. (celle-ci doit surement changer les attributs de cet objet)
    ensuite tu ajoutes ton objet à la collection.
    Or ton erreur viens de là : au tour suivant, tu remodifis les attributs de la même instance de l'objet test, et tu l'ajoutes à ta collection.
    Ta collection contiens donc 2 fois la même instance de ton objet test.
    Quand tu modifis les attributs d'un objets test tu les modifis tous dans ta collection. Car la collection est qu'une collection de "pointeurs".

    Il faut donc que tu rajoutes les lignes suivante :

    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
     
    Ligne.connection(chemin) ' Il faut que ca soit une méthode partagée (shared)
     
    'instanciation de la collection
    tableau = New CollectionDeLigne
     
    'recuperation du nombre de lignes contenu dans le tableau
    compte = Ligne.nbre_de_ligne() ' Pareil : shared
     
        For i = 2 To compte
     
            'je rempli mon objet avec les donnée du tableau (je ne le fait pas dans le constructeur, sinon j'ai une erreur)
            test = New Ligne()
            test.remplissage(i)
     
            'j'ajoute la ligne a ma collection
            tableau.add(test)
        Next
     
    'j'affiche les données de ma collection
    tableau.affichage()
     
    'je ferme ma connection
    test.fermeture_connection()
    PS: j'avais pas vu la ligne : test = nothing
    mais c'est quand même normal que ca ne fonctionne pas car tu ne créés pas de nouvelle instance de ton objet.
    Ingénieur Multimédia - TMM Communication

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut
    ben voila ce que me met mon ami (plus pour longtemp) visual studio

    Une exception non gérée du type 'System.NullReferenceException' s'est produite dans test.exe

    Informations supplémentaires*: La référence d'objet n'est pas définie à une instance d'un objet.

    bidou, ce que je veut, c'est remplir mon objet avec des valeurs différentes a chaque passage de la boucle. En bref, j'ai un tableau excel, je m'y connect, et je souhaite récuperer toutes les lignes de ce tableau dans une collection afin de les traiter.

    Mais je n'arrive pas a changer les valeurs de l'objet, resultat, ma collection est pleine d'objet qui ont les memes valeurs

  6. #6
    Membre expérimenté Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Points : 1 482
    Points
    1 482
    Par défaut
    Essaye de reprendre ton premier code et de retirer la ligne test = nothing
    Ingénieur Multimédia - TMM Communication

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut
    Ben mon ex copain visual me met le meme message... il est pas joueur du tout ce petit. Mais tu pourrait me dire comment tu verrait la chose car la je patauge...
    de plus, mes test indique que :
    quand je rentre la premiere valeur, ca marche, ensuite, quand je met la deuxieme, ca ecrase la premiere avec les valeurs de la deuxieme, puis ajoute la deuxieme a la bonne place, et ainsi de suite, resultat, il ne me reste que les valeurs de la derniere ligne quand mon traitement se termine.
    Je me demandait si ca ne venait pas du fait que j'utilisait l'objet collection, et que je faisait un
    collection.add(ligne)
    ???
    ne vaudrait t'il pas mieux utiliser un array list, ou une linked list (a moin que ce ne soit en JAVA..... )

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par boubounne
    quand je rentre la premiere valeur, ca marche, ensuite, quand je met la deuxieme, ca ecrase la premiere avec les valeurs de la deuxieme, puis ajoute la deuxieme a la bonne place, et ainsi de suite, resultat, il ne me reste que les valeurs de la derniere ligne quand mon traitement se termine.
    Ce comportement est caractéristique de ce que t'a expliqué LaChips.

    Si tu as fait ce qu'il t'a dit et que tu as toujours une erreur, c'est que son origine doit se trouver autre part.

    Peux-tu nous montrer d'autres portions de ton code ? Notamment les classes Ligne et CollectionDeLigne (qui doit dériver de ICollection, n'est-ce pas ?).

    Peux-tu nous dire où se trouve la portion de code que tu nous a montré (dans quelle classe) ?

    Sais-tu utiliser le débogueur de ton fidèle ami Visual Studio ? Sinon, va jeter un coup d'oeil sur cet article, au chapitre "3. Les outils de débogage"

  9. #9
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut
    bon ben voila mes classes (je sait la presente et la synthaxe sont merdique, mais c'est un progr de test pour le moment...)
    la classe principale (form 1 un peu allégée..)
    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
    78
    79
    80
    81
    82
     
    Imports System
    Imports System.Data
    Imports System.Web
    Imports System.IO
    Imports Microsoft.Office.Interop
     
    Public Class Form1
        Inherits System.Windows.Forms.Form
     
    'attributs
        Dim chemin As String
     
    'methodes
        Private Sub Btn_parcourir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_parcourir.Click
     
            With OpenFileDialog1
     
                .Title = "Ouvrir"       'Titre de la barre de titre
     
                .InitialDirectory = "c:\"   'répertoire de départ        
     
                .Filter = "Fichiers XLS|*.XLS" ' on travaille uniquement sur les .txt
     
                's'il y a plusieurs filtres les séparer par ;  
     
                .Multiselect = False      'sélectionner 1 seul fichier
     
                .CheckFileExists = True   'Message  si nom de fichier qui n'existe pas.
     
                'Permet d'ouvrir uniquement un fichier qui existe; CheckPathExists peut aussi être utilisé. 
     
                .ValidateNames = True      'n'accepte que les noms valides (win 32)
     
                .AddExtension = False      'ajoute une extension au nom s'il n'y en a pas
     
            End With
     
            If OpenFileDialog1.ShowDialog = DialogResult.OK Then  'L'utilisateur a bien cliqué sur ok
                Txt_cheminFichier.Text = OpenFileDialog1.FileName
                chemin = Txt_cheminFichier.Text
                Btn_valider.Visible = True
            End If
     
        End Sub
     
        Private Sub Btn_quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_quitter.Click
            Me.Close()
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Btn_valider.Visible = False
        End Sub
     
        Private Sub Btn_valider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_valider.Click
     
            Dim i As Integer
            Dim ligne As String
            Dim tableau As CollectionDeLigne
            Dim test As New Ligne
     
            test.connection(chemin)
     
            'instanciation de la collection
            tableau = New CollectionDeLigne
     
            'recuperation du nombre de lignes contenu dans le tableau
            ligne = test.nbre_de_ligne()
     
            For i = 2 To ligne
                test.remplissage(i)
                tableau.ajoute(test)
            Next
     
            test.fermeture_connection()
     
            'affichage de la collection
            tableau.affichage()
     
        End Sub
     
    End Class
    puis voici la classe ligne, elle sert a récuperer les enregistrements contenus dans le tableau excel. Une variable par element de la ligne...
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    Imports System
    Imports System.Data
    Imports System.Web
    Imports System.IO
    Imports Microsoft.Office.Interop
    Imports System.Data.Common
    Imports System.Resources
     
    Public Class Ligne
     
        'attributs
        Private StrCodeUGE As String
        Private StrNomUGE As String
        Private StrCodeMaitreOuvrage As String
        Private StrNomMaitreOuvrage As String
        Private StrAdresse1MaitreOuvrage As String
        Private StrAdresse2MaitreOuvrage As String
        Private StrCPMaitreOuvrage As String
        Private StrCommuneMaitreOuvrage As String
        Private StrCodePayeur As String
        Private StrNomPayeur As String
        Private StrAdresse1Payeur As String
        Private StrAdresse2Payeur As String
        Private StrCPPayeur As String
        Private StrCommunePayeur As String
        Private StrCodePSV As String
        Private StrCommunePSV As String
        Private StrNomPSV As String
        Private StrLieuPSV As String
        Private StrTypeEau As String
        Private StrTypeINST As String
        Private StrCodeINST As String
        Private StrNomINST As String
        Private oExcelApp As Excel.ApplicationClass
        Private oBooks As Excel.Workbooks
        Private oBook As Excel.Workbook
        Private oSheet As Excel.Worksheet
        Private oRien As Object
     
        'Constructeur de la classe
     
        Public Sub New()
     
        End Sub
     
        Public Sub remplissage(ByVal i As Integer)
     
            'insertion des données du tableau dans les variables correspondantes
            StrCodeUGE = CStr(oSheet.Cells(i, 1).Value2)
            StrNomUGE = CStr(oSheet.Cells(i, 2).Value2)
            StrCodeMaitreOuvrage = CStr(oSheet.Cells(i, 3).Value2)
            StrNomMaitreOuvrage = CStr(oSheet.Cells(i, 4).Value2)
            StrAdresse1MaitreOuvrage = CStr(oSheet.Cells(i, 5).Value2)
            StrAdresse2MaitreOuvrage = CStr(oSheet.Cells(i, 6).Value2)
            StrCPMaitreOuvrage = CStr(oSheet.Cells(i, 7).Value2)
            StrCommuneMaitreOuvrage = CStr(oSheet.Cells(i, 8).Value2)
            StrCodePayeur = CStr(oSheet.Cells(i, 9).Value2)
            StrNomPayeur = CStr(oSheet.Cells(i, 10).Value2)
            StrAdresse1Payeur = CStr(oSheet.Cells(i, 11).Value2)
            StrAdresse2Payeur = CStr(oSheet.Cells(i, 12).Value2)
            StrCPPayeur = CStr(oSheet.Cells(i, 13).Value2)
            StrCommunePayeur = CStr(oSheet.Cells(i, 14).Value2)
            StrCodePSV = CStr(oSheet.Cells(i, 15).Value2)
            StrCommunePSV = CStr(oSheet.Cells(i, 16).Value2)
            StrNomPSV = CStr(oSheet.Cells(i, 17).Value2)
            StrLieuPSV = CStr(oSheet.Cells(i, 18).Value2)
            StrTypeEau = CStr(oSheet.Cells(i, 19).Value2)
            StrTypeINST = CStr(oSheet.Cells(i, 20).Value2)
            StrCodeINST = CStr(oSheet.Cells(i, 21).Value2)
            StrNomINST = CStr(oSheet.Cells(i, 22).Value2)
     
        End Sub
     
        Public Sub connection(ByVal chemin As String)
     
            oRien = System.Reflection.Missing.Value
            oExcelApp = New Excel.ApplicationClass
     
            'je n'affiche pas mon tableau excel
            oExcelApp.Visible = False
     
            'j'ouvre le tableau
            oBooks = oExcelApp.Workbooks
            oBook = oBooks.Open(chemin, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien, oRien)
            oSheet = oBook.Worksheets(1)
     
        End Sub
     
        Public Sub fermeture_connection()
     
            'je quitte excel
            oExcelApp.Quit()
            oExcelApp = Nothing
     
        End Sub
     
        Public Function nbre_de_ligne() As Integer
     
            Dim a As Integer
     
            a = 2
     
            While (oSheet.Cells(a, 2).value2 <> "")
                a = a + 1
            End While
     
            Return a - 2
     
        End Function
     
        Public Function affiche() As String
     
            Return StrCodeUGE
     
        End Function
     
    End Class

    puis enfin la classe collection de ligne, qui contient toutes les lignes :
    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
     
    Imports System
    Imports System.Data
    Imports System.Data.Odbc
     
    Public Class CollectionDeLigne
     
        'attributs
        Private CollecTableau As New Collection
     
            'chaine de connection
            'Provider=MSDASQL.1;Persist Security Info=False;Data Source=Fichiers Excel;Extended Properties="DSN=Fichiers Excel;DBQ=Txt_cheminFichier.Text;DefaultDir=C:\base de données;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"
     
        'methodes
        Public Sub ajoute(ByVal ligne As Ligne)
     
            'ajout de la ligne dans le tableau
            CollecTableau.Add(ligne)
     
        End Sub
     
        Public Sub affichage()
     
            Dim i As Integer
            For i = 1 To CollecTableau.Count - 1
                MsgBox(i)
                MsgBox(CollecTableau.Item(i).affiche)
            Next
     
        End Sub
    end Class
    merci de m'aider (je sens que je vais finir par pleurer si ca continu a mettre des messages d'erreur.... )

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Dans le code du bouton valider, met un Try catch et affiche tout le détail de l'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Try
    ' Tout le code de ton bouton valider ici.
    catch ex as Exception
        MessageBox.Show(ex.ToString())
    end try
    ça va déjà te donner la ligne où l'erreur se produit.

  11. #11
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 337
    Points : 319
    Points
    319
    Par défaut
    bon c'est bon, en frappant fort sur ma tour, le programme a redemarre, il a pas marché mieux, mais ca ma calmé, et j'ai finalement trouvé une maniere de faire mon traitement, bon, ca ne marche pas exactement comme je le voulai, mais ca marche...
    (apres quand meme 5 jour de reflexion, j'adore le developpement pour ces petits moment de plaisir apres une longue agonie..... )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Fair une boucle sur des objets Ranges
    Par Escorpion dans le forum Excel
    Réponses: 6
    Dernier message: 18/03/2015, 18h14
  2. Boucle sur les objets de la classe
    Par mactwist69 dans le forum VB.NET
    Réponses: 6
    Dernier message: 05/06/2014, 15h27
  3. Boucle sur des objets d'une feuille
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 09/07/2013, 09h54
  4. [AC-2002] Boucle sur les objets chart dans Userform
    Par Kriss63 dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/02/2010, 09h56
  5. Réponses: 10
    Dernier message: 16/04/2009, 10h39

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