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 :

Assignation explicite dans une boucle if: problème


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut Assignation explicite dans une boucle if: problème
    Bonjour,

    Je souhaite créer une procédure dans laquelle j'envoie comme paramètre un objet (ListBox ou Combobox). Car le traitement est identique que ce soit un ListBox ou un ComboBox

    Lorsque la procédure reçoit l'objet, je dois l'assigner explicitement à son type.
    Exemple qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           public static void Test(Object form_box)
            {
                ListBox form_box1 = (ListBox)form_box;
     
                int a=form_box1.Items.Count;
            }
    A priori, je ne sais pas si Objet est un ListBox ou un ComboBox, donc je fais un test pour vérifier son type.
    Le problème provient de la boucle if qui m'impose de déclarer l'objet en dehors de la boucle.
    Exemple qui ne fonctionne pas:
    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
     
      public static void Test(Object form_box)
            {
                Object form_box1 = null;
    //   ComboBox form_box1 = null;
     
                if (form_box is ListBox)
                {
                    form_box1 = (ListBox)form_box;
                }
                else if (form_box is ComboBox)
                {
                    form_box1 = (ComboBox)form_box;
                }
                else
                {
                    MessageBox.Show("Error_Type"); 
                }
                int a=form_box1.Items.Count;
            }
    MErci d'avance pour votre aide !

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void Test(Object form_box)
    {
        int a= 0 ;
        if      (form_box is ListBox ) { ListBox  form_ListBox  = (ListBox )form_box; a=form_ListBox .Items.Count; }            
        else if (form_box is ComboBox) { ComboBox form_ComboBox = (ComboBox)form_box; a=form_ComboBox.Items.Count; }            
        else MessageBox.Show("Error_Type");
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Par défaut
    Salut Ch123,

    Il faut penser au plus grand dénominateur commun, qui dépend de ce que tu veux faire dans ton traitement.
    En l'occurrence, si le traitement ne concerne que la collection d'items, tu peux faire ça :

    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 Form1()
    {
        InitializeComponent();
     
        ListBox listBox = new ListBox();
        ComboBox comboBox = new ComboBox();
        test(listBox.Items);
        test(comboBox.Items);
    }
     
    void test(IList items)
    {
        int a = items.Count;
    }
    Ca s'appelle la loi de Demeter : http://msdn.microsoft.com/en-us/maga...aspx#id0070040

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut Créer une assignation explicite dépendante d'une condition if: problème
    Bonjour
    Merci bcp. pour vos deux propositions.

    Super idée d'envoyer en paramètre la Collection des Items. Je ne connaissais pas cette possibilité.
    Mais dans mon cas, le traitement que je veux faire ensuite, c'est entre autre de remplir la ListBox ou la ComboBox...

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     string[] Fichiers = Directory.GetFiles(myDir, Filtre);
                foreach (string Fichier in Fichiers)
                {
                    Console.WriteLine(Fichier);
                    form_box1.Items.Add(Fichier);
                }
    Dès lors, ca ne suffit pas la Collection des items. Il faut envoyer l'objet complet

    Concernant la première proposition, quitte à créer deux variables avec 2 traitements spécifiques, alors autant directement créer deux procédures indépendantes.

    Mon souhait est justement de n'avoir qu'une seule variable (et donc un seul traitement commun) que la variable d'entrée soit une ListBox ou une ComboBox

    Si vous avez d'autres idées...
    MErci d'avance,

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void Test(Object form_box)
    {
        if      (form_box is ListBox ) ProcessItems((ListBox )form_box.Items) ;            
        else if (form_box is ComboBox) ProcessItems((ComboBox)form_box.Items) ;            
        else MessageBox.Show("Error_Type");
    }
    
    public static void ProcessItems(ItemCollection Items)
    {
      a=Items.Count;
    }

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Sinon voici une solution à éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ItemCollection Items = form_box.GetType().GetProperty("Items").GetValue(form_box,null) ;

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    On aurait pu mettre un cast avec un "ListControl" si Microsoft avait pensé à mettre le membre "Items" en membre abstrait dans la classe "ListControl" et c'est pour ça effectivement qu'on se prend la tête sur ce sujet...

    L'idée de TheOnlyMaX est super bonne.

    Après, on peut faire un helper qui renvoie ce qu'il faut pour compléter l'idée de TheOnlyMaX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static class ListControlHelper
    {
       public static System.Collection.IList GetItems(this ListControl source)
       {
          if (source is ListBox)
             return ((ListBox)source).Items;
          if (source is ComboBox)
             return ((ComboBox)source).Items;
          //Rajouter d'autres if si ça s'applique...
          else
             throw new NotSupportedException("Cette classe dérivée n'est pas supportée encore");
       }
    }
    C'est vrai que la propriété Items de ListBox renvoie un ListBox.ObjectCollection et Items de ComboBox renvoie un ComboBox.ObjectCollection qui ne sont pas les même types mais qui implémentent tous deux l'interface "IList" non générique. Et après on peut se débrouiller avec.

    Du coup, avec le helper que j'ai mis, on peut alors passer un "ListControl" en paramètres et lorsque l'on veut accéder aux items on peut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void Test(ListControl form_box)
    {
       //...Divers traitements
     
       //Accès aux items :
       IList mesItems = form_box.GetItems();
     
       //Ajout par exemple :
       mesItems.Add("Un nouveau texte");
    }
    Voilà.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Par défaut
    Hello,

    La solution que j'ai proposée fonctionne parfaitement.
    Par contre, il faut absolument éviter de solliciter 2 fois le disque dur.

    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
     
    public Form1()
    {
    	InitializeComponent();
     
    	string path = @"C:\Windows";
    	string searchPattern = "*.exe";
     
    	string[] files = Directory.GetFiles(path, searchPattern);
     
    	FillList(listBox1.Items, files);
    	FillList(comboBox1.Items, files);
    }
     
    void FillList(IList items, string[] files)
    {
    	foreach (string file in files)
    		items.Add(file);
    }

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut
    Bonsoir,
    Un grand merci à tous pour toutes vos propositions, ça marche parfaitement !!

    PS: c'est dommage qu'en c#, on ne peut pas envoyer l'objet comme paramètre (Listbox ou combobox) en le déclarant juste comme 'Objet' et travailler directement dessus. En VB.NET, on peut le faire.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ch123 Voir le message
    PS: c'est dommage qu'en c#, on ne peut pas envoyer l'objet comme paramètre (Listbox ou combobox) en le déclarant juste comme 'Objet' et travailler directement dessus. En VB.NET, on peut le faire.
    Depuis la version 4 du Framework.NET, on peut déclarer un objet comme étant "dynamic"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void Test(dynamic form_box)
    {
       //...
    }
    Cela fait la même chose que pour VB.NET.
    Cela dit, personnellement je préfère la méthode que j'ai montré plus haut, c'est beaucoup plus propre.

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

Discussions similaires

  1. Problème dans une boucle
    Par Pitou5464 dans le forum Access
    Réponses: 5
    Dernier message: 11/08/2006, 14h51
  2. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  3. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  4. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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