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

Windows Forms Discussion :

[VB.net 2005] Boucle et ArrayList


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut [VB.net 2005] Boucle et ArrayList
    hello,

    suite de mon travail, je dois parcourir des cellules d'un datagridview (remplis par dataset), récupérer des données decimal et les additionner...

    j'ai des choses qui sont ok :

    - pointer les cellules : DataGridView1.Rows(0).Cells(3).Value
    - créer un ArrayList pour stocker ces valeurs : Dim Liste As New ArrayList()

    le hic, c'est que suivant quand, j'ai x ou y rows... alors je fais un RowCount : Dim Nbre_Rows = DataGridView1.RowCount

    maintenant, je cherche la bonne synthaxe pour créer une boucle qui, suivant le nombre de rows, les parcours et mette les données dans mon tableau... pis à la fin, je fais un sum de l'ArrayList et c'est réglé...

    c'est au niveau de la boucle que ça pêche !...j'ai ça pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim Nbre_Rows = DataGridView1.RowCount
    Dim Liste As New ArrayList()
    Dim Nbre_Rows2 = Nbre_Rows
     
            For i As Integer = 1 To Nbre_Rows
                Dim t As Decimal
                t = DataGridView1.Rows(Nbre_Rows2 - 1).Cells(3).Value
                Liste.Add(t)
            Next
    mais ça bug la moindre...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    ton message d'erreur n'es pas du tout décrit essaye d'être plus précis STP.
    Fais un mode debug et regarde ou cela "bug" car on peut pas faire grand chose pour toi ...
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Yes, excuse-moi

    ben en fait, si je mets le code dans le FormLoad, c'est simple, ça mouline et j'dois aller killer le process dans le TaskManager.....

    si je mets dans un autre sub (celui de mon DateTimePicker, puisqu'il me sert de filtre et que c'est là que les données changent...), ben mon form ne s'ouvre pas...
    car en fait, j'ai un form1 ou je me connecte... si c'est bon, je fais un Form2.Show()... et là il gueule...

    donc mon code :

    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
     
     Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged
     
            Dim Nbre_Rows = DataGridView1.RowCount
     
            Dim Liste As New ArrayList()
     
            While Nbre_Rows <> 0
                Dim t As Decimal
                t = DataGridView1.Rows(Nbre_Rows - 1).Cells(3).Value
                Liste.Add(t)
     
            End While
     
            ShowDialog(Liste)
    et l'erreur est sur le Form1...

    ==> L'exception InvalidOperationException n'a pas été gérée

    Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Impossible d'effectuer un cast d'un objet de type 'System.Collections.ArrayList' en type 'System.Windows.Forms.IWin32Window'.

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Lors de l'appel à ShowDialog, tu passes en paramètres une ArrayList, ce qui n'est pas possible.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par collaud_vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While Nbre_Rows <> 0
        Dim t As Decimal
        t = DataGridView1.Rows(Nbre_Rows - 1).Cells(3).Value
        Liste.Add(t)
    End While
    Pour moi, tu as une boucle infini
    Sans parler de l'appel de la méthode ShowDialog()

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    ça expliquerait pkoi j'dois aller killer le process dans le Task...

    j'dois avouer que je m'en doutais.... j'vous ai pas djà dit que j'étais un newb ?

    une idée ?

    ça, c'est peut-être déjà mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    While Nbre_Rows > 0
                Dim t As Decimal
                t = DataGridView1.Rows(Nbre_Rows).Cells(3).Value
                Liste.Add(t)
                Nbre_Rows = Nbre_Rows - 1
     
            End While
    ---edit---

    j'ai fais le debug pas à pas... mon Nbre_Rows a bien la valeur 3 !... comprends pas... pis pkoi ça serait infini...

    Tant que Nbre_Rows est plus grand que 0, etc...

    chais pas !

  7. #7
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Essaye le pas-à-pas.
    Dans VS.Net :
    - tu ajoute un break point dans ton code (tu tapes F9 sur la ligne "Liste.Add(t)")
    - tu lances l'appli en faisant F5
    - tu regarde les valeurs de chacunes de tes variables en déplacant le curseur de souris dessus (sans clicker)
    - tu tapes F5 pour l'itération suivante.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    La seconde boucle, me plait déjà beaucoup mieux.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    oui j'ai fait le pas-à-pas ! j'ai édité mon dernier post ...je fais avec F10...

    mais je vais refaire comme tu me dis pour être sûr ! Mais peut-être que je devrais plutôt utiliser le For To... des fois que le While embêterait...

    mais dans le principe... mon code semble correct... (mais bon, c'est moi qui dit hein...)

    ----edit----

    mais j'vois demain... now fini boulot....

  10. #10
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Et si tu le fais pas à pas , tu sors de la boucle à un moment ou pas ???

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Il est obligé de sortir.
    Vu qu'il décrémente sa variable a chaque passage dans la boucle...

    A un moment donné sa variable sera égale a 0...
    Ce que je ferais (en C#)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i=Nbre_Rows ; i>0 ; i--)
    {
        //Ajout dans ta liste
    }
    ou dans l'autre sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i=1; i<=Nbre_Rows ; i++)
    {
        //Ajout dans ta liste   
    }

  12. #12
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par 0xYg3n3
    Il est obligé de sortir.
    Vu qu'il décrémente sa variable a chaque passage dans la boucle...
    Je sais mais c'était pas une question pour toi

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Alors en l'état des choses, je sors même pas... ça coince là, à la ligne 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    While Nbre_Rows > 0
                Dim t As Decimal
                t = DataGridView1.Rows(Nbre_Rows).Cells(3).Value
                Liste.Add(t)
                Nbre_Rows = Nbre_Rows - 1
     
            End While
    mais mon Nbre_Rows a bien une valeur ! mais arrivé à la ligne 3, il me chie un :

    "L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index"

    Il doit y avoir une combine avec le fait qu'en VB, l'index part à 0, ou un truc du genre... mais moi j'ai 0,01% d'expérience en prog.............

    ---edit---

    c'est peut-être effectivement du à une problème de 0... je regarde de ce côté maintenant (noté ce qui est en gras... marrant hein ?....) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     For i As Integer = 0 To Nbre_Rows - 1
                Dim t As Integer = DataGridView1.Rows(i).Cells(3).Value
                Liste.Add(t)
            Next
    ça mets plus d'erreur en debug... faut que j'affiche mon array now !

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    purée mais j'en ai marre !!

    comment on fait pour afficher les éléments d'un ArrayList ?!?

    ---edit---

    en fait la question serait plutôt : est-ce que je me fais pas chier avec un arraylist ?........

    ---edit---

    bon, après recherche de références dans un book, j'ai opté pour des Collections, mais j'sais pas si c'est mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Liste As New Collection()
     
            For i As Integer = 0 To Nbre_Rows - 1
                Dim t As Decimal = DataGridView1.Rows(i).Cells(3).Value
                Liste.Add(t)
                TextBox5.Text = Liste(1)
            Next
    ce code fonctionne, j'ai la bonne valeur dans mon textbox, mais si je mets autre chose que '1' dans la propriété de Liste (dernière ligne), ça bug... donc ma boucle est pas à 100%......

    ---edit---

    ARRGGG....chuis trop con !! Evidemment que Liste(2) va pas aller au premier passage de la boucle... faut que j'affiche après la boucle !!... enfin, je me suis compris.... quel bourrique...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    gentiment, mais surement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     For i As Integer = 0 To Nbre_Rows - 1
                Dim t As Decimal = DataGridView1.Rows(i).Cells(3).Value
                Liste.Add(t)
            Next
     
            Dim element As Decimal
            For Each element In Liste
                Console.WriteLine(element)
            Next
    plus qu'à réussir à additionner les éléments... mais là je sèche (aussi...)
    comment faire cela sans fonction 'somme' ???

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    amen, allelouia !!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    For i As Integer = 0 To Nbre_Rows - 1
                Dim t As Decimal = DataGridView1.Rows(i).Cells(3).Value
                Liste.Add(t)
            Next
     
            Dim element As Decimal
            Dim sum As Decimal
            For Each element In Liste
                sum += element
            Next
     
            TextBox6.Text = sum
    purée mais plus c'est facile, moins on trouve vite.... "+="...2 caractères...

    conseil aux newb's : oubliez la touche F1, allez sur la librairie msdn ! http://msdn.microsoft.com/library/fre/

    merci Mose et 0xYg3n3

    mais j'sens qu'un autre topic se prépare.....

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

Discussions similaires

  1. [VB.net 2005]ComboBox.DataSource ignore l'ArrayList source
    Par Macintoc dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/08/2006, 19h31
  2. DX 9 et visual.net 2005 ?
    Par ilimo dans le forum DirectX
    Réponses: 1
    Dernier message: 27/07/2004, 10h55

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