none
Identifier choix sur menu icones RRS feed

  • Question

  • Bonjour à tous,

    je souhaite que mon application principale(Form1) lance au démarrage une autre fenêtre(Form2) demandant à l'utilisateur de faire un choix entre 2 rubriques.

    Jusque là, pas de soucis je penses. J'utilise au lancement de l'application(Form1) un Form2.ShowDialog.

    Les rubriques sur la Form2 sont représentées par des icônes. Je voudrais pouvoir récupérer dans la Form1 le choix fait par l'utilisateur (ex: Caisse, Comptabilité...).

    Je ne sais pas très bien comment procéder puisque DialogResult ne permet de récupérer que les valeurs telles que (OK, Abort, Retry...). Peut-on en définir nous même?

    Merci pour votre aide.

    jeudi 29 novembre 2012 10:09

Réponses

  • Bonsoir,

    J'ai fait un exemple. J'ai juste oublié de changer l'icône du deuxième bouton mais ça répond à votre demande (du moins je pense) :

    https://skydrive.live.com/redir?resid=11D26A7936907971!157&authkey=!AGJ6cILWJ7AJDUk

    Est-ce que c'est ce que vous cherchez ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    • Marqué comme réponse paintbox00 jeudi 29 novembre 2012 17:51
    jeudi 29 novembre 2012 17:35
  • Bonjour,

    je pense avoir trouvé la solution à mon problème. J'ai utilisé un Delegate et un Event. 

    Dans ce cas ci, l'utilisation de DialoResult n'est pas adéquat puisqu'il n'est possible de récupérer que les valeurs prédéfinies à savoir : Non, Ok, Cancel, Abort, Yes, No....

    Moi je veux récupérer le choix en "toute lettre" soit Caisse soit Compta.

    Mon but était:

    - L'application principale(Form1) ouvre une fenêtre(Form2) où l’utilisateur peut faire un choix entre n rubriques (symbolisées par des icones). Une fois le choix fait, la Form2 se ferme et laisse la main à la Form1.

    Ce qui donne :

    Form1

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                Form2 f= new Form2();
                f.Show();
                f.monEvent += new Form2.EChoixUtilisateur(ChoixUtilisateur);
               
               
            }
    
            public void ChoixUtilisateur(string reponse)
            {
                TBReponse.Text = reponse; 
                if (TBReponse.Text == "Caisse")
                {
                    MessageBox.Show("Choix: Caisse");
                }
                else if (TBReponse.Text == "Compta")
                {
                    MessageBox.Show("Choix: Compta");
                }
            }
        }

    et le Form2

    public partial class Form2 : Form
        {
            public delegate void EChoixUtilisateur(string reponse);
    
            public event EChoixUtilisateur monEvent;
    
    
    
            public Form2()
            {
                InitializeComponent();
            }
    
            // => Bouton Caisse
            private void PCTBCaisse_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBCaisse.Tag));
                    this.Close();
                }
            }
    
            // => Bouton Compta
            private void PCTBCompta_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBCompta.Tag));
                    this.Close();
                }
            }
        }

    par après, le Form1 (mon application principale) affichera le contenu correspondant au choix de l'utilisateur.

    Merci à tous pour votre aide.

    De mon coté c'est résolu.

    • Marqué comme réponse paintbox00 jeudi 29 novembre 2012 17:33
    jeudi 29 novembre 2012 17:33

Toutes les réponses

  • Bonjour,

    Une solution consisterait en ajouter une propriété public à la classe Form2 :

            public enum Choix { Caisse, Comptabilité }
    
            public Choix ChoixUtilisateur
            {
                get;
                set;
            }

    Vous avez peut-être déjà défini le type enum, vous pouvez aussi fair la distinction entre choix par d'autres moyens (codes entiers).

    Puis vous mettez à jour cette propriété quand l'utilisateur fait un choix (event changement sur la liste déroulante).

    Puis il suffit de récupérez la valeur de la propriété à la sortie de la méthode Form2.ShowDialog.

    Form2.ChoixUtilisateur

    Cordialement.

    jeudi 29 novembre 2012 11:31
    Auteur de réponse
  • Bonjour,

    merci pour votre réponse.

    En cherchant sur le net, j'ai également trouver cette solution, mais comment déterminer que l'image 1 est Caisse et l'image 2 est Comptabilité? Comment lier l'énumération aux images et récupérer la valeur?

    Merci

    jeudi 29 novembre 2012 11:49
  • Bonjour

    Pourquoi ne pas faire une classe avec un deux propriétés, type image pour l'icône et type int ou string pour le type de choix.

    et en fonction du type int ou string faire une action et pour l'image l'affecter au ChoixUtilisateur.

    exemple

    public class Rubrique
    {
       public Image ImageRubrique{get; set}
       public NomRubrique as string{get; set}
    }
    

    Avez-vous compris la réponse ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine jeudi 29 novembre 2012 13:39
    jeudi 29 novembre 2012 13:39
  • Bonjour,

    j'ai créé la classe Rubrique comme suggéré

     class Rubriques
        {
            public string ImageRubrique { get; set; }
            public string NomRubrique { get; set; }
        }

    et dans mon Form, j'ai instancié 2 objets de type Rubriques dans lesquels j'ai mis 1° l'icone 2° le nom de la rubrique. Comme ceci :

    public Rubriques pc1, pc2;
            public Bitmap icone1, icone2;
            
            public Form3()
            {
                InitializeComponent();
                pc1 = new Rubriques();
                pc2 = new Rubriques();
    
                pc1.ImageRubrique = @"C:\Users\Documents\Visual Studio 2010\Projects\NET_6_MOIS\C#\Exe_Home_D\New_Exe\DialogResult_Icones\DialogResult_Icones\Resources\1354144411_cashbox.png";
                icone1 = new Bitmap(pc1.ImageRubrique);
                pc1.NomRubrique = "Caisse";
    
                pc2.ImageRubrique = @"C:\Users\Documents\Visual Studio 2010\Projects\NET_6_MOIS\C#\Exe_Home_D\New_Exe\DialogResult_Icones\DialogResult_Icones\Resources\1354144484_cabinet.png";
                icone2 = new Bitmap(pc2.ImageRubrique);
                pc2.NomRubrique = "Comptabilite";
    
                PCTBCaisse.Image = icone1;
                PCTBCompta.Image = icone2;

    Est-ce exacte?

    A propos? Mes images sont dans un dossier Ressources de mon projet. N'y a-t-il pas moyen de donner un chemin moins long que c:\Users\Documents.... ?

    Je ne vois pas comment  renvoyer la valeur à mon autre fenêtre et que mon image réagisse comme un bouton ?

    Merci pour votre aide.

    jeudi 29 novembre 2012 14:27
  • Vous utilisez quel contrôle pour le choix ? un ComboBox, ListBox ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 29 novembre 2012 14:57
  • J'utilise des PictureBox dans lesquels j'ai mis mes icones. Quand je clique dessus, j'obtiens le nom de la rubrique dans une MessageBox, mais je n'arrive pas à retourner cette valeur dans min DialogResult.

    Merci

    jeudi 29 novembre 2012 15:04
  • salut, pour les fichier "PNG" vous les mettez dans le REP de l'EXE et vous utilisez 

    Application.StartupPath

    pourquoi ne pas utilisez l'évènement click de vos Images 

    jeudi 29 novembre 2012 15:11
  • Attention, ce n'est pas l'icone de l'application que je cherche à exploiter.
    jeudi 29 novembre 2012 15:39
  • Bonjour,

    personnellement, si les images ne sont pas modifiables, je les mettrais dans un fichier de ressources... comme ça, plus de problème de localisation des fichiers images.

    Si tu souhaite garder les images .png, tu peux utiliser un chemin relatif à l'exe genre ./Ressources/image.png. Dans ce cas, il faut que tu modifier les propriétés des images dans Visual Studio : Copier dans le répertoire de sortie = toujours copier.

    Cordialement.


    jeudi 29 novembre 2012 17:05
  • Bonjour,

    je pense avoir trouvé la solution à mon problème. J'ai utilisé un Delegate et un Event. 

    Dans ce cas ci, l'utilisation de DialoResult n'est pas adéquat puisqu'il n'est possible de récupérer que les valeurs prédéfinies à savoir : Non, Ok, Cancel, Abort, Yes, No....

    Moi je veux récupérer le choix en "toute lettre" soit Caisse soit Compta.

    Mon but était:

    - L'application principale(Form1) ouvre une fenêtre(Form2) où l’utilisateur peut faire un choix entre n rubriques (symbolisées par des icones). Une fois le choix fait, la Form2 se ferme et laisse la main à la Form1.

    Ce qui donne :

    Form1

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                Form2 f= new Form2();
                f.Show();
                f.monEvent += new Form2.EChoixUtilisateur(ChoixUtilisateur);
               
               
            }
    
            public void ChoixUtilisateur(string reponse)
            {
                TBReponse.Text = reponse; 
                if (TBReponse.Text == "Caisse")
                {
                    MessageBox.Show("Choix: Caisse");
                }
                else if (TBReponse.Text == "Compta")
                {
                    MessageBox.Show("Choix: Compta");
                }
            }
        }

    et le Form2

    public partial class Form2 : Form
        {
            public delegate void EChoixUtilisateur(string reponse);
    
            public event EChoixUtilisateur monEvent;
    
    
    
            public Form2()
            {
                InitializeComponent();
            }
    
            // => Bouton Caisse
            private void PCTBCaisse_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBCaisse.Tag));
                    this.Close();
                }
            }
    
            // => Bouton Compta
            private void PCTBCompta_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBCompta.Tag));
                    this.Close();
                }
            }
        }

    par après, le Form1 (mon application principale) affichera le contenu correspondant au choix de l'utilisateur.

    Merci à tous pour votre aide.

    De mon coté c'est résolu.

    • Marqué comme réponse paintbox00 jeudi 29 novembre 2012 17:33
    jeudi 29 novembre 2012 17:33
  • Bonsoir,

    J'ai fait un exemple. J'ai juste oublié de changer l'icône du deuxième bouton mais ça répond à votre demande (du moins je pense) :

    https://skydrive.live.com/redir?resid=11D26A7936907971!157&authkey=!AGJ6cILWJ7AJDUk

    Est-ce que c'est ce que vous cherchez ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    • Marqué comme réponse paintbox00 jeudi 29 novembre 2012 17:51
    jeudi 29 novembre 2012 17:35
  • Bonsoir Lyamine,

    je viens de tester votre code et oui cela correspond à ce que je voulais faire. Et j'ai testé le résultat du DialogResult c'est OK, on le récupère bien dans l'application principale.

    Il y a donc moyen de récupérer le résultat d'un DialogResult qui n'est pas les valeurs prédéfinies à savoir : Non, Ok, Cancel, Abort, Yes, No....

    Il y a donc 2 solutions au problème que je rencontrais.

    Les 2 se valent je pense, avec les Delegate il n'est pas nécessaire de créer un Class supplémentaire.

    Un grand merci pour votre aide !

    jeudi 29 novembre 2012 17:51
  • salut Lyamine, sa bug.

    si tu ferme la fenêtre sans choix il y a un résulta.

    j'ai moi aussi fais un exemple moins élégant mais...  

      
    jeudi 29 novembre 2012 18:15
  • Ah oui j'ai oublié de faire en sorte de mettre par defaut sur Cancel dans l'instance de la 2ème fenêtre. J'ai corrigé le problème, désolé (même lien). En plus c'est la première chose à laquelle j'ai pensé à faire et j'ai oublié ^^

    PS : j'ai amélioré la fenêtre, c'est du détail...

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 29 novembre 2012 19:12