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

C# Discussion :

Probleme avec une exeption ArgumentException


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Probleme avec une exeption ArgumentException
    Bonjour à tous,

    Voilà j'ai un problème avec cette exception que je n'arrive pas à résoudre,

    Voici mon CS :

    Là c'est la fonction qui gére le clic sur le bouton ajouter qui me permet d'ajouter des éléments à ma ListView
    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
     
                // Bouton AJOUTER du tableau de contrôle MOTO
            private void Ajouter1_Click(object sender, EventArgs e)
            {
                Liste1.Items.Clear();
                if (itemMoto != null)
                {
                    for (int i = 0; i < 100; i++)
                    {
                        if (itemMotos[i] != null)
                            Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i] });
                    }
                }
     
                    if (TBCode.Text != "" && TBConstructeur.Text != "" && TBCouleur.Text != "" && TBPuissanceMoteur.Text != ""
                        && TBVitesse.Text != "")
                    {
                        Moto tmp = new Moto(Int16.Parse(TBVitesse.Text), Int16.Parse(TBCode.Text), TBConstructeur.Text, TBCouleur.Text, Int16.Parse(TBPuissanceMoteur.Text));
                        if (motos.Ajout(tmp))   // Si l'ajout reussis
                        {
                            // On crée un item qui prend comme nom le code de la moto
                            if(itemMoto == null)
                                itemMoto = new ListViewItem("" + Convert.ToString(tmp.Code), 0);
                            itemMoto.Name = Convert.ToString(tmp.Code);
                            itemMoto.Checked = true;
                            // On lui ajoute les autres valeurs (Nom constructeur, couleur ...)
                            itemMoto.SubItems.Add("" + tmp.Constructeur);
                            itemMoto.SubItems.Add("" + tmp.Couleur);
                            itemMoto.SubItems.Add("" + Convert.ToString(tmp.Puissance_moteur));
                            itemMoto.SubItems.Add("" + Convert.ToString(tmp.Vitesse));
     
                            for (int i = 0; i < 100; i++)
                            {
                                if (itemMotos[i] == null)
                                {
                                    itemMotos[i] = itemMoto;
                                    break;
                                }
                            }                        
     
                            // On les ajoute à la ListeView
                            for (int i = 0; i < 100; i++)
                            {
                                if(itemMotos[i] != null)
                                    Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i]});
                            }
     
     
                        }
                        else
                        {
                            MessageBox.Show("L'ajout n'a pas fonctionne", "Erreur", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                            // Si les champs ne sont pas tous pleins on affiche un message
                        MessageBox.Show("Veuillez remplir tous les champs", "Erreur", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                    }
            }
    Voici ce qui ce passe dans le constructeur de la fenêtre :

    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
     
            public AchatVechicules()
            {
                InitializeComponent();
     
                camions = new LesCamions();
                voitures = new LesVoitures();
                motos = new LesMotos();
     
                itemMotos = new ListViewItem[100];
     
                Liste1.Columns.Add("Code",40);
                Liste1.Columns.Add("Constructeur",75);
                Liste1.Columns.Add("Couleur",50);
                Liste1.Columns.Add("Puissance du moteur",115);
                Liste1.Columns.Add("Vitesse");
     
                Liste1.GridLines = true;    //Afiche une grille sur la ListView
     
                for(int i=0;i<100;i++)
                {
                    itemMotos[i] = null;
                }
            }
    Et les déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            LesCamions camions;
            LesVoitures voitures;
            LesMotos motos;
     
            ListViewItem itemMoto = null;
            ListViewItem itemVoiture = null;
            ListViewItem itemCamion = null;
     
            ListViewItem[] itemMotos;
    C'est cette ligne qui génère l'erreur:

    Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i]});
    C'est une des dernière ligne de la fonction Ajouter1_Click

    Le compilateur (Visual Studio Express 2010) me dit :

    System.ArgumentException: Impossible d'ajouter ou d'insérer l'élément '5' à plusieurs emplacements. Vous devez tout d'abord le supprimer de son emplacement actuel ou le cloner.
    Ou 5 est le nom de la ListViewItem itemMoto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    itemMoto = new ListViewItem("" + Convert.ToString(tmp.Code), 0);
    Je ne comprends pas cette exception, quel est le problème exactement ?

    Merci de votre aide,
    Simon.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Bonjour,

    Est-ce que tu pourrais nous procurer ton code sous forme de pseudo code?

    À regarder ton extrait, il me semble que l'usage d'arrays, de C loops et d'indexes est inutile et je suis persuadé que l'utilisation de listes génériques et de linq/lambdas viendrait éclaircir le tout.

    Personnellement, je crois qu'il y a corruption compteur/index quelque part.

  3. #3
    Nouveau membre du Club Avatar de Léonard Labat
    Homme Profil pro
    Consultant .NET
    Inscrit en
    Juillet 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 17
    Points : 33
    Points
    33
    Par défaut
    Bonjour

    En WPF, deux elements graphiques ne peuvent pas être associés à deux parents à la fois. Dans ta première method, tu vides une liste, la remplis et un peu plus loin la re remplies à nouveau avec les memes datas. Essaye de remplacer ta deuxieme boucle for par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      for (int i = 0; i < 100; i++)
                            {
                                if(itemMotos[i] != null && !Liste1.Items.Contains(itemMotos[1]))
                                    Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i]});
                            }
    Un autre axe d'amélioration serait peut être de séparer un peu ton code métier du code de ta vue, je t'invite alors à regarder du côté de MVVM.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci de votre aide


    Léonard Labat :

    J'ai mis ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                            for (int i = 0; i < 100; i++)
                            {
                                if (itemMotos[i] != null)
                                {
                                    if (itemMotos[i] != null && !Liste1.Items.Contains(itemMotos[i]))
                                        Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i] });
                                }
                            }
    A la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                            for (int i = 0; i < 100; i++)
                            {
                                if(itemMotos[i] != null)
                                    Liste1.Items.AddRange(new ListViewItem[] { itemMotos[i]});
                            }
    Mais cela ne marche toujours pas, de plus je pense que c'est une faute de frappe, mais tu avais mis "!Liste1.Items.Contains(itemMotos[1])" j'ai donc remplacé par "i".


    Babyneedle :


    Est-ce que tu pourrais nous procurer ton code sous forme de pseudo code?
    L'algorithme ?

    En gros je fais ceci :

    Je récupéré et vérifie les valeurs entrées dans des TextBox
    Je crée une instance temporaire de Moto
    Je l'ajoute a mon tableau de Moto de ma classe LesMotos
    Je crée une ListViewItem auquel j'ajoute des SubItems auquel je donne comme valeur les contenus des TextBox
    Ensuite je cherche via un for le 1er index null de mon tableau de ListViewItem et j'y copie ma ListViewItem temporaire précédemment créée puis je break après l'ajout
    Puis j'ajoute les index non null de mon tableau de ListViewItem à ma ListView [C'est ici qu'il y a un problème]


    À regarder ton extrait, il me semble que l'usage d'arrays, de C loops et d'indexes est inutile et je suis persuadé que l'utilisation de listes génériques et de linq/lambdas viendrait éclaircir le tout.
    Je suis encore très débutant Si tu as des techniques facilement implémentable je t'écoute volontiers



    Personnellement, je crois qu'il y a corruption compteur/index quelque part.
    C'est à dire ?

    Merci à tous
    Simon,

    Edit:

    De plus je voulais savoir pourquoi ceci ne marche pas :
    Liste1.Items.AddRange(itemMotos);

    Puisque itemMotos est un tableau de ListViewItem

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

Discussions similaires

  1. PROBLEME AVEC UNE TABLE INTERBASE
    Par barro dans le forum InterBase
    Réponses: 1
    Dernier message: 22/09/2004, 08h16
  2. [C#] [Oracle] Probleme avec une procedure stockée
    Par sronin1 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/05/2004, 19h04
  3. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24
  4. au secour probleme avec une requete...
    Par soufiane59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/09/2003, 10h28
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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