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 :

Colorer le fond de certain objet dans une Combox en la comparant à une liste


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Colorer le fond de certain objet dans une Combox en la comparant à une liste
    Bonjour tout le monde.

    Voici mon problème, je développe actuellement une application fenêtre en C#, et je bloque sur un problème.

    J'ai une liste avec des noms de serveurs et une combox avec des noms de serveurs aussi.

    Le but de la manoeuvre serait de coloré le fond de chaque nom de serveur dans la combo box qui se trouverait à la fois dans la combo box et dans la liste.

    Pour cela, je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private void Coloration()
            {
                foreach (object item in Cbx_serveur.Items)
                {
                    foreach (object itembis in Lst_invisi.Items)
                    {
                        if (item.ToString() == itembis.ToString())
                        {
     
                        }
                    }
                }
            }
    Mais je ne sais pas quoi mettre dans mon if pour réaliser la coloration.

    Merci beaucoup d'avance pour vous êtes penché sur mon problème

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    il faut trapper l'evenement DrawItem et faire le boulot dedans

    sans oublier la propriété DrawMode en mode OwnerDrawFixed ou autre suivant besoin

    A ma connaissance, c'est la façon la plus rapide

    En 10 minutes, c'est normalement fait !
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut RE
    Citation Envoyé par theMonz31 Voir le message
    il faut trapper l'evenement DrawItem et faire le boulot dedans

    sans oublier la propriété DrawMode en mode OwnerDrawFixed ou autre suivant besoin

    A ma connaissance, c'est la façon la plus rapide

    En 10 minutes, c'est normalement fait !
    Bonjour et merci de votre réponse

    Malheuresement je suis débutant en developpement .Net donc j'ai un peu de mal à saisir ce que vous voulez dire.

    Si vous pouviez me donner plus de piste, ça serait super.

    Merci d'avance

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Le dessin des objets d'une combobox se fait dans la méthode DrawItem.

    Un evenement est dédié à celà dans la comboBox.

    Si tu passes la propriété de la comboBox DrawMode à celui que j'ai précise et que tu écoutes l'evenement DrawItem, tu rentreras dans le gestionnaire de l'évènement à chaque fois qu'il faudra faire un dessin d'un Item.

    imagines que tu as une form avec une combo et un bouton

    le code suivant fait ce que tu veux

    A adapter suivant tes besoins mais le principe y est
    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
     
    public partial class Form1 : Form
        {
            private List<string> serverList = new List<string>();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void ServerCb_DrawItem(object sender, DrawItemEventArgs e)
            {
                string value = (string)ServerCb.Items[e.Index];
                Color bckColor = Color.White;
                if (serverList.Contains(value))
                {
                    bckColor = Color.LightSteelBlue;
                }
     
                SolidBrush br = new SolidBrush(bckColor);
                SolidBrush fontBr = new SolidBrush(Color.Black);
                e.Graphics.FillRectangle(br, e.Bounds);
                e.Graphics.DrawString(value, ServerCb.Font, fontBr, e.Bounds);
                fontBr.Dispose();
                br.Dispose();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 1; i < 10; i++)
                {
                    serverList.Add("serveur_" + i.ToString());
                }
     
                for (int i = 1; i < 16; i+=2)
    			{
                    ServerCb.Items.Add("serveur_"+ i.ToString());
    			}
            }
        }
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut RE
    Citation Envoyé par theMonz31 Voir le message
    Le dessin des objets d'une combobox se fait dans la méthode DrawItem.

    Un evenement est dédié à celà dans la comboBox.

    Si tu passes la propriété de la comboBox DrawMode à celui que j'ai précise et que tu écoutes l'evenement DrawItem, tu rentreras dans le gestionnaire de l'évènement à chaque fois qu'il faudra faire un dessin d'un Item.

    imagines que tu as une form avec une combo et un bouton

    le code suivant fait ce que tu veux

    A adapter suivant tes besoins mais le principe y est
    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
     
    public partial class Form1 : Form
        {
            private List<string> serverList = new List<string>();
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void ServerCb_DrawItem(object sender, DrawItemEventArgs e)
            {
                string value = (string)ServerCb.Items[e.Index];
                Color bckColor = Color.White;
                if (serverList.Contains(value))
                {
                    bckColor = Color.LightSteelBlue;
                }
     
                SolidBrush br = new SolidBrush(bckColor);
                SolidBrush fontBr = new SolidBrush(Color.Black);
                e.Graphics.FillRectangle(br, e.Bounds);
                e.Graphics.DrawString(value, ServerCb.Font, fontBr, e.Bounds);
                fontBr.Dispose();
                br.Dispose();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 1; i < 10; i++)
                {
                    serverList.Add("serveur_" + i.ToString());
                }
     
                for (int i = 1; i < 16; i+=2)
    			{
                    ServerCb.Items.Add("serveur_"+ i.ToString());
    			}
            }
        }

    Merci beaucoup pour ce code, mais le problème désormais, c'est que je voudrais que l'élément soit colorer au load de la feuille, et j'ai plutôt l'impréssion que ce code est destiné à un evenement, du genre quand on clique sur le contrôle .

    Et par dessiner, tu entends ajouter une élément à la combo box?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Bonjour,

    Non, non, par dessiner, il entend bien dessiner.
    A chaque fois que le visuel de l'application doit être (re)affiché, il appel la methode de dessin. (premier affichage, une autre fenêtre qui passe au dessus, un appel à invalidate(), etc...)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ketan Voir le message
    Bonjour,

    Non, non, par dessiner, il entend bien dessiner.
    A chaque fois que le visuel de l'application doit être (re)affiché, il appel la methode de dessin. (premier affichage, une autre fenêtre qui passe au dessus, un appel à invalidate(), etc...)
    Le soucis désormais, c'est que je n'arrive pas à faire évoluer l'index qui reste bloqué à 0 et donc tous les éléments sont rouges

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    le code de theMonz31 est parfaitement correct, montre nous ton code pour que l'on puisse t'aider, car moi je ne vois pas le problème.
    (pour l'exemple, ton cas signifie que tout les élément de la combobox sont dans serverList, ce qui est toujours vrai si la combobox en question est remplie avec serverList)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut RE
    Citation Envoyé par ketan Voir le message
    le code de theMonz31 est parfaitement correct, montre nous ton code pour que l'on puisse t'aider, car moi je ne vois pas le problème.
    (pour l'exemple, ton cas signifie que tout les élément de la combobox sont dans serverList, ce qui est toujours vrai si la combobox en question est remplie avec serverList)

    Voici 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
         private void Cbx_serveur_DrawItem(object sender, DrawItemEventArgs e)
            {
                foreach (object item in Cbx_serveur.Items)
                {
     
                    foreach (object itembis in Lst_invisi.Items)
                    {
                        if (item.ToString() == itembis.ToString())
                        {
     
                            string value = (string)Cbx_serveur.Items[e.Index];
                            Color bckColor = Color.Green;
     
                            SolidBrush br = new SolidBrush(bckColor);
                            SolidBrush fontBr = new SolidBrush(Color.Black);
                            e.Graphics.FillRectangle(br, e.Bounds);
                            e.Graphics.DrawString(value, Cbx_serveur.Font, fontBr, e.Bounds);
                            fontBr.Dispose();
                            br.Dispose();
     
                        }
     
                        else
                        {
                            string value = (string)Cbx_serveur.Items[e.Index];
                            Color bckColor = Color.Red;
     
     
                            SolidBrush br = new SolidBrush(bckColor);
                            SolidBrush fontBr = new SolidBrush(Color.Black);
                            e.Graphics.FillRectangle(br, e.Bounds);
                            e.Graphics.DrawString(value, Cbx_serveur.Font, fontBr, e.Bounds);
                            fontBr.Dispose();
                            br.Dispose();
                        }
                    }
                }
            }
    Le problème, dans ma combox de serveur, je vois avoir une quarantaine de serveurs et dans ma lst box avec laquelle je la compare, je n'ai que deux serveurs.
    Pourtant, toutes ma combox est colorée en rouge, alors que je voudrais que ces deux serveurs soit vert, et le reste tout rouge.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Je pense que tu as très mal compris ou interprété le code theMonz31...
    Ton code est très mauvais.
    Non seulement il ne peut pas te donner le résultat que tu veux car il te dessine à chaque fois le résultat de la comparaison du dernier élément de chaque tableau, mais en plus, il te fait un nombre de dessin pour chaque élément de Cbx_serveur.Items équivalent à :
    Cbx_serveur.Items * Lst_invisi.Items
    ce qui fait d'après tes données 80 pour chaque affichage d'élément (soit si tu déroule ta textbox jusqu'a 2400 dessins).

    Une version plus correcte serais ceci:
    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
     
         private void Cbx_serveur_DrawItem(object sender, DrawItemEventArgs e)
            {
                string value = (string)Cbx_serveur.Items[e.Index];
                Color bckColor = Color.Red;
     
                foreach (object item in Lst_invisi.Items)
                {
                    if (value == item.ToString())
                    {
                        bckColor = Color.Green;
                        break;
                    }
                }
                SolidBrush br = new SolidBrush(bckColor);
                SolidBrush fontBr = new SolidBrush(Color.Black);
                e.Graphics.FillRectangle(br, e.Bounds);
                e.Graphics.DrawString(value, Cbx_serveur.Font, fontBr, e.Bounds);
                fontBr.Dispose();
                br.Dispose();
            }
    ça devrait fonctionner.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ketan Voir le message
    Je pense que tu as très mal compris ou interprété le code theMonz31...
    Ton code est très mauvais.
    Non seulement il ne peut pas te donner le résultat que tu veux car il te dessine à chaque fois le résultat de la comparaison du dernier élément de chaque tableau, mais en plus, il te fait un nombre de dessin pour chaque élément de Cbx_serveur.Items équivalent à :

    ce qui fait d'après tes données 80 pour chaque affichage d'élément (soit si tu déroule ta textbox jusqu'a 2400 dessins).

    Une version plus correcte serais ceci:
    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
     
         private void Cbx_serveur_DrawItem(object sender, DrawItemEventArgs e)
            {
                string value = (string)Cbx_serveur.Items[e.Index];
                Color bckColor = Color.Red;
     
                foreach (object item in Lst_invisi.Items)
                {
                    if (value == item.ToString())
                    {
                        bckColor = Color.Green;
                        break;
                    }
                }
                SolidBrush br = new SolidBrush(bckColor);
                SolidBrush fontBr = new SolidBrush(Color.Black);
                e.Graphics.FillRectangle(br, e.Bounds);
                e.Graphics.DrawString(value, Cbx_serveur.Font, fontBr, e.Bounds);
                fontBr.Dispose();
                br.Dispose();
            }
    ça devrait fonctionner.
    Merci beaucoup ton code fonctionne parfaitement et j'ai compris mes erreurs avec tes explications.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/03/2014, 19h42
  2. Réponses: 3
    Dernier message: 16/07/2013, 00h48
  3. Réponses: 1
    Dernier message: 02/10/2010, 16h43
  4. Réponses: 4
    Dernier message: 01/05/2009, 15h41
  5. comparer une valeur de formulaire et une chaine de caractere.
    Par minirom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/08/2006, 10h53

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