Supprimer element d'une class

SanDum Messages postés 39 Date d'inscription vendredi 23 avril 2010 Statut Membre Dernière intervention 24 avril 2014 - 5 mai 2013 à 22:19
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 8 mai 2013 à 14:18
Bonjour à tous

J'ai une class ou j'aimerais enlevé des éléments:
 public class Numero
        {
            public int Num=0;
            public List info = new List();   
        }
        public class Info
        {
            public string Nom, Prenom, EmailP,EmailS,NumTelP,NumTelS,Fax,Adresse,Com,DateNais,Relation; 
        }


Par exemple, une fois remplie, j'ai Num=8, donc j'ai 8 clients avec leurs coordonnées.
Je voudrais enlever le 3 ème client. J'ai réussie à enlever les informations du 3 ème client( nom, adresse, tel,...) comme ceci:
NumeroClient.info[Select] = null; // Select est l’élément a retirer (3)
NumeroClient.Num--;

mais l'"espace" attribué au client est encore pris, car dans ma classe, j'ai encore 8 cases.
Je n'ai pas trouvé l'option RemoveAt(i) comme on peut trouver dans plusieurs exemple.
Comment faire ?
Merci
Grégory

9 réponses

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
6 mai 2013 à 09:11
Bonjour,
Il faut que tu enlèves ton élément de la liste avec la fonction Remove.
NumeroClient.info.RemoveAt[Select];


Num est inutile, car tu peux l'obtenir à tout instant par une propriété, ce qui t'évite de gèrer ce nombre
int Num
{
   get
   {
    return info.Count;
   }
}


Bon codage.
louis
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
6 mai 2013 à 09:38
Bonjour
si ton num set à compter le nombre d'enregistrement dans ta list d'infos, il y a plus symple:
info.Count;


NumeroClient.info[Select] = null; // Select est l’élément a retirer (3)
là tu n'enlèves pas un élément tu le remplace par null

Je n'ai pas trouvé l'option RemoveAt(i) comme on peut trouver dans plusieurs exemple

Remove() ne sert pas à enlever l'enregistrement à un index, ça c'est RemoveAt(). Remove enlève une instance, deux exemples:
            info toto = info[1];
            info.Remove(toto);//remove enlève l'instance toto

            info.RemoveAt(3);//removeAt enlève l'index 3


Tes classes sont "mal codées", il est très déconseillé en C# de mettre les variables Public, voilà qui serait mieux
    public class Numero
    {
        //public int Num = 0;
        private List info = new List();// ma variable privée

        public List Infos// une propriété pour y accéder
        {
            get { return info; }
            set { info = value; }
        }

        public int Num//num qui retourne le nombre d'enregistrement devient en lecture seule
        {
            get { return info.Count; }
        }
    }


pour le cas ou (aujourd'hui) tu n'as pas besoin de variable interne à la classe alors comme ça
    public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Ainsi le jour ou tu dois agir sur une donnée dans la classe, tu crees une variable interne, reformule les get set et pour l'extérieur pas de cahngements
Whismeril
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
6 mai 2013 à 10:42
Ha j'ai été tellement long à taper que louis m'a grillé!


Whismeril
0
SanDum Messages postés 39 Date d'inscription vendredi 23 avril 2010 Statut Membre Dernière intervention 24 avril 2014
6 mai 2013 à 13:35
Allo les gars

Merci pour vos conseilles. Mais ni Remove(toto) ni RemoveAt(3) ne fonctionne, voici le message d'erreur:

Erreur	1	'WindowsFormsApplication1.Form1.Info' ne contient pas une définition pour 'RemoveAt' et aucune méthode d'extension 'RemoveAt' acceptant un premier argument de type 'WindowsFormsApplication1.Form1.Info' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)	C:\Users\Gregory\Desktop\Carnet\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs	149	18	WindowsFormsApplication1



Voici les using dans mon code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml.Serialization;
using System.Xml;


Ensuite, je veux bien essayer de changer mes classes pour qu'elles ne soient plus public comme me propose Whismeril par
public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Je ne connais pas la façon de faire une classe avec {get; set;}(je commence avec les classes), je vais devoir chercher un peu, mais ne manquerais t'il pas un liste quelque par dans l'exemple, car les données doivent se répéter pour chaque client ??!!

Merci
Greg
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
6 mai 2013 à 14:08
Tu mélanges le type de la donnée (la classe Info) et le contenant des plusieurs instances de cette donnée (la liste info)

Dans mes exemple, la liste de type Info existe toujours dans la classe Numero, j'ai tendances à mettre un s à mes noms de listes pour me dire "tiens y'a pleins d'infos c'est donc une liste!"

Les méthodes Remove et RemoveAt sont issues de la List, celle qui est dans la classe Numéro pas celle de la classe Info




Whismeril
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
6 mai 2013 à 14:08
ReBonjour,
Je pense que ton problème vient du nommage de tes variables, tu ne doit pas utiliser la bonne variable;ta classe s'appelle Info avec majuscule et ta list info avec minuscule, c'est cette dernière qu'il faut utiliser :
 List infos = new List();


Après avoir ajouté tes éléments, tu peux faire
infos.RemoveAt(3);


Par contre si tu veux enlever le troisième, l'index doit être 2 , car le premier index est 0.

Sinon, il faut suivre les indications de Whismeril en ce qui concerne les élements de ta classe , tout en privé et ensuite on crée des propriétés pour y accéder. Et essaie de ne pas nommer une liste de classe avec le même nom que la classe. Dans ton cas
List infos =  new List()

serait mieux pour éviter les confusions.
louis
0
SanDum Messages postés 39 Date d'inscription vendredi 23 avril 2010 Statut Membre Dernière intervention 24 avril 2014
7 mai 2013 à 02:33
Allo les gars

Merci de votre aide. Malheureusement, je n'aurais pas le temps de regarder cela avant la fin de semaine.

Dès que j'ai un moment, je fais les modifications que vous m'avez conseillé.

Merci encore

Greg
0
SanDum Messages postés 39 Date d'inscription vendredi 23 avril 2010 Statut Membre Dernière intervention 24 avril 2014
8 mai 2013 à 13:45
Une dernière information avant que je fasse toutes les modifications.

En me servant du code:
public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Je voudrais avoir l'option de mettre soit les noms ou prénoms en ordre alphabétique. Est-ce que selon vous j'ai besoin d'avoir d'autres informations pour y arriver ?

Je m'explique, de la façon dont je l'ai fait, je ne pense pas pouvoir mettre les noms et prénoms en ordre alphabétique, car le premier client entré, avait la case 1, le deuxième avait la case 2... c'est en sélectionnant son nom avec une listbox (qui contenient tous les clients),je récupérais ça position, ce qui me permettait d'afficher les informations propre au nom. Mais si je met les noms dans un ordre différent, le nom de la case 1 ne correspond plus forcement aux informations que contient la case 1.

En écrivant ces lignes, je dis que peut-être que c'est la classe complète qu'il faudrait modifier quand je fais le tri (ce qui semble difficile), de cette façon, les informations continuent à se suivre ou de créer un tableau de liaison qui me permettrais de savoir que les clients 4 est maintenant à la position 10 et le client 2 à la position 4...

Quand pensez-vous ?

Greg
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
8 mai 2013 à 14:18
Bonjour pour trier une liste tu as (au moins) deux solutions:
1 implémenter l'interface iComparable

public class Info:iComparable

Tu fais click droit / implémenter l'interface sur iComparable, ça va t'écrire une méthode CompareTo, laquelle doit retourner -1 (= plus petit) 0 (= égal) ou 1 (= plus grand).
Pour comparer sur le Nom ça s'écrit comme ça:
return this.Nom.CompareTo(other.Nom);//Nom est un string qui est déjà iComparable


2 utiliser Linq

Whismeril
0
Rejoignez-nous