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 :

Partager un ContextMenu entre plusieurs Forms


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 8
    Par défaut Partager un ContextMenu entre plusieurs Forms
    Bonjour à tous et toutes,

    J'aimerais savoir comment faire pour utiliser un ContextMenu, qui est crée dans "Form1", dans une autre form "Form2"?

    Tout d'abord, voici comment je crée la Form2 dans Form1.cs, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void Form1_Load(object sender, EventArgs e)
    {
      Form2 desktopText = new Form2();
      desktopText.Show();
    }

    J'ai essayé ceci, dans Form2.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Form2()
    {
      InitializeComponent();
     
      label1.ContextMenu = Form1.contextMenu1;
    }
    Ce qui me donne ces erreurs:
    erreur CS0122: 'AK.Form1.contextMenu1' est inaccessible en raison de son niveau de protection
    erreur CS0120: Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'AK.Form1.contextMenu1'
    J'ai donc essayé de modifier le contrôle dans Form1.Designer.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //changé private en public
    public System.Windows.Forms.ContextMenu contextMenu1;
    Mais ça n'a résolut que la première erreur, mais pas la deuxième:
    erreur CS0120: Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'AK.Form1.contextMenu1'

    Cependant, je sais que je peux faire ceci:

    Dans Form2.Designer.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //changé private en public
    public System.Windows.Forms.Label label1;
    Dans Form1.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void Form1_Load(object sender, EventArgs e)
    {
      Form2 desktopText = new Form2();
      desktopText.Show();
      desktopText.label1.ContextMenu = contextMenu1;
    }
    Ca fonctionne, mais j'aimerais savoir comment accéder à ce ContextMenu directement dans Form2.cs, sans devoir modifier Form1.cs.


    Pouvez-vous m'aider SVP à comprendre mon erreur, ou y a t-il une meilleure méthode?

    Merci d'avance et soyez indulgents je suis débutant

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Par défaut
    je vois deux possibilité pour toi

    1) tu peux créer le context menu par le code
    auquel cas tu places la fonction avec une visibilité shared ce qui te permettra l utiliser dans toute ta solution

    2) lors de la création de la seconde form tu passes le contextmenu de la form1 par valeur et tu l attaches à la form2


    dans les deux cas, tu devras l appeler via la form2 ( mais le context menu sera identique a form1)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 8
    Par défaut
    Désolé mais je n'ai rien compris à votre message :S

    Un petit example de code vaut souvent mieux que du texte


    En fait ce que je voudrais, c'est une sorte de "pointeur vers Form1", un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Form2()
    {
      InitializeComponent();
     
      Form1 LaForm1 = Form1();
      label1.ContextMenu = LaForm1.contextMenu1;
    }
    (bien sûr, ca ne marche pas)

    Y a t-il un moyen de récupérer ce pointeur (ou handle, object... je ne sais pas comment ca s'apelle :S), de cette façon je pourrais accéder à tous les contrôles de Form1, dans Form2.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Par défaut
    Je te proposais en fait de dupliquer le code ( form1 form 2 pour le context menu )


    pour le passage en réference, je ne sais pas si ca peut marcher ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 8
    Par défaut
    Pour l'instant j'ai fait comme ceci, ca a l'air de fonctionner:

    Dans Form1.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Form1()
    {
        InitializeComponent();
     
        Form2 desktopText = new Form2(this);
        desktopText.Show();
    }
    Dans Form1.Designer.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public System.Windows.Forms.ContextMenu contextMenu1;
    Dans Form2.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Form1 form1;
     
    public Form2(Form1 form)
    {
        form1 = form;
     
        InitializeComponent();
     
        label1.ContextMenu = form1.contextMenu1;
    }
    Si quelqu'un à une meilleure solution (avec un exemple) je suis preneur

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour JohnDoe57

    C'est un probleme de portee :les controls et composants(timer,tooltip etc..) droppes sur un form sont privates donc inaccessible à l'exterieur...
    Si tu veux les rendre accessibles utilise avec moderation la prop Modifiers du control:

    -internal qui veut accessible aux amis c'est à dire les forms d'un meme projet..


    code du form1 et du form2:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    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;
     
    namespace WinContextMenu
    {
        //  dropper 2 ContextMenu1s
        //  nomme :  myContextMenu1 & myContextMenu2
        //  mettre prop modifiers de myLabel1
        //  a internal (accessibilite friend)
        public partial class Form1 : Form
        { 
     
            Form2 desktopText = new Form2();
            public Form1()
            {
                InitializeComponent();
                myContextMenu1.Name = "ContextMenu1";
                myContextMenu2.Name = "ContextMenu2";
            }
            private void contextMenu1_Popup(object sender, EventArgs e)
            {
                MessageBox.Show("ctx menu1");
            }
     
            private void Form3_Load(object sender, EventArgs e)
            {
     
                //myContextMenu1 assigne au form desktop
                desktopText.ContextMenu = myContextMenu1;
     
                //myContextMenu2 assigne à mylabel1 du form desktop
                desktopText.myLabel1.ContextMenu = myContextMenu2;
                desktopText.Show();
            }
     
     
     
            private void myContextMenu1_Popup(object sender, EventArgs e)
            {
     
                desktopText.BackColor = Color.LightBlue;
     
            }
     
            private void myContextMenu2_Popup(object sender, EventArgs e)
            {
                desktopText.myLabel1.BackColor = Color.LightGreen ;
            }
        }
    }
     
    /////////////
    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;
     
    namespace WinContextMenu
    { 
     
        //ton form desktop
        public partial class Form2 : Form
        {
            //  dropper un label nomme :  myLabel1
            //  mettre prop modifiers de myLabel1
            //  a internal (accessibilite friend)
            public Form2()
            {
                InitializeComponent();
     
     
            }
        }
    }
    bon code.....

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/11/2006, 19h20
  2. Réponses: 12
    Dernier message: 14/08/2006, 12h55
  3. Partage de variables entre plusieurs pages
    Par bud_gw dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/12/2005, 15h42
  4. Partager une version entre plusieurs DLL
    Par barthelv dans le forum MFC
    Réponses: 4
    Dernier message: 22/11/2005, 10h25
  5. partager un schema entre plusieurs utilisateurs
    Par jrman dans le forum Oracle
    Réponses: 5
    Dernier message: 15/12/2004, 16h53

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