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 :

Désactiver un MenuItem de la fiche principale.


Sujet :

Windows Forms

  1. #1
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut Désactiver un MenuItem de la fiche principale.
    salut.
    je suis tout nouveau a CSharp et le .NET en général, je viens de delphi alors je trébuche pour des chose basique.

    j'ai créer un projet test ou j'ai deux fiche une principale et une secondaire
    la fiche principale contient un Menu qui permet d'ouvrir les autres fiche, afin d'éviter que l'utilisateur créer plusieurs instances de la meme fiche j'ai pensez à gérer ça dans l'évènement Load et FormClosed en activant et désactivant tous les controls faisant appel a celle-ci.
    mais il m'est impossible d'accéder aux propriétés des control de la fiche principale, c'est ordinaire cars il sont déclarer en Private, j'ai créer une méthode d'écriture sur la fiche principale comme ceci:

    soit :
    fMenu : Ma fenetre principale.
    menuClient: le meniItem pour ouvrir la fiche
    fClient : fiche secondaire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public menuClientEnabled bool
     {
     set {mcenuClient.Enabled = value; }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      private void fClient_Load(object sender, EventArgs e)
            {
               // fMenu.menuClientEnabled = false;
                // TODO*: cette ligne de code charge les données dans la table 'myDataBaseDataSet1.Clients'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
                this.clientsTableAdapter.Fill(this.myDataBaseDataSet1.Clients);
     
                fMenu.menuClientsEnabled = false;
     
     
            }
    j'ai une exception
    Erreur 1 Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'WindowsFormsApplication2.fMenu.menuClientEnabled.set' C:\Documents and Settings\aityahiaidir.CIEPTALCARS\Mes documents\Visual Studio 2008\Projects\Project1\WindowsFormsApplication2\WindowsFormsApplication2\Form2.cs 28 13 WindowsFormsApplication2
    merci d'avance et a plus.

  2. #2
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    rend public le menuItem sur lequel tu veux agir

  3. #3
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Citation Envoyé par fally Voir le message
    rend public le menuItem sur lequel tu veux agir
    cette solution ma été vivement déconseillé alors je cherche une solution plus propre.

  4. #4
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Citation Envoyé par aityahia Voir le message
    cette solution ma été vivement déconseillé alors je cherche une solution plus propre.
    Je doute fort qu'il existe un moyen d'agir sur un menuitem d'une form sans le rendre public; sinon si ton problème est d'empêcher d'ouvrir 2fois la même fenêtre, il y a eu un post la dessus y'a quelques mois. je cherche et je t'envoie le lien

  5. #5
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Citation Envoyé par fally Voir le message
    Je doute fort qu'il existe un moyen d'agir sur un menuitem d'une form sans le rendre public; sinon si ton problème est d'empêcher d'ouvrir 2fois la même fenêtre, il y a eu un post la dessus y'a quelques mois. je cherche et je t'envoie le lien
    oui j'ai vu le post qui consiste a vérifier si une instance de la fenêtre existe déjà, mais la pratique de griser le menu et courante sous Windows, je pense qu'avec une implémentation de la Class de la fiche avec une méthode set et faisable.

  6. #6
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    j'ai une proposition mais cela devra t'obliger a rendre public tes menuitem
    désolé

  7. #7
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Citation Envoyé par fally Voir le message
    j'ai une proposition mais cela devra t'obliger a rendre public tes menuitem
    désolé
    je vous écoute

  8. #8
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Citation Envoyé par aityahia Voir le message
    je vous écoute
    sur le clic du menuitem, le griser en même temps enabled = false et a la fermeture de la fenetre, agir sur le meme menuitem pour le rendre enabled = true

  9. #9
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Citation Envoyé par fally Voir le message
    sur le clic du menuitem, le griser en même temps enabled = false et a la fermeture de la fenetre, agir sur le meme menuitem pour le rendre enabled = true
    pour la première c'est faisable mais pour la second je suis dans le même problème je changer le menuItem a partir de la fiche fille.

  10. #10
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il me paraît plus propre que ce soit ta form principale qui grise ou pas ses propres contrôles. C'est elle le chef, après tout

    Donc : dans le code de la form mère, tu crées ta form fille, tu t'abonnes à son événement de fermeture (Closed), et tu grises ton menuItem ; après, dans la méthode abonnée à Closed, tu ré-actives ton menuItem.

    Mais plutôt que griser le menu, tu peux imaginer d'activer la form fille si jamais on reclique dessus. Ca me paraît plus intuitif, comme comportement.

  11. #11
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Ok avec toi Guulh, mais il souhaite griser au lieu de réafficher la form
    Au clic sur le menuItem :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // sur la form principale
    //code code code
    public MonMenuItem;
    MonMenuItem.Enabled = false;
    A la fermeture de la form fille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // code  code code
    FormPrincipale.MonMenuItem.Enabled = true;
    this.Close();

  12. #12
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    n'oublier pas que je réfléchis toujours en delphi.

    Citation Envoyé par Guulh Voir le message
    Il me paraît plus propre que ce soit ta form principale qui grise ou pas ses propres contrôles. C'est elle le chef, après tout
    si on peut capté les évènement des autres fiche je suis d'accord.


    Citation Envoyé par Guulh Voir le message
    Donc : dans le code de la form mère, tu crées ta form fille, tu t'abonnes à son événement de fermeture (Closed), et tu grises ton menuItem ; après, dans la méthode abonnée à Closed, tu ré-actives ton menuItem.
    Comment.

    Citation Envoyé par Guulh Voir le message
    Mais plutôt que griser le menu, tu peux imaginer d'activer la form fille si jamais on reclique dessus. Ca me paraît plus intuitif, comme comportement.
    oui je suit d'accord, mais pour moi c'est juste un test, j'aimerais maitriser les interactions entre Fiche au plutôt dire entre classes car ça sera toujours utile de changer le statut d'un composant sur la fiche principale.

    une dernière question quelle est le nom de linstancie la fiche principale, je sais quelle est crée ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run(new Form1());
    mais je trouve l'instant.

  13. #13
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    n'oubliez pas que je réfléchis toujours en delphi
    Mais tu codes en C#
    Bon voila,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run(new Form1());
    ce code lance la form Form1 (qui est de préférence la forme principale). Sur cette forme tu as placé un Menu qui contient des MenuItem; tu souhaites empêcher l'utilisateur de recliquer sur un MenuItem tant qu'il n'aura pas fermé la fiche qu'il a ouverte par ce MenuItem (bien résumé? )
    Pour ce faire, ton MenuItem a un événement Click et derrière ce événement tu places
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonMenuItem.Enabled = false; // le menuitem est grisé
    Mafiche fiche = new Mafiche();
    fiche.Show(); //affiche la fiche
    donc à ce niveau le MonMenuItem est grisé et ta fiche est affichée. Mais il faut qu'une fois la fiche fermée, il puisse recliquer sur le MenuItem. ta fiche (qui est une form) a un événement OnClosing dans lequel tu places
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.MonMenuItem.Enabled = true; // le menuitem est dégrisé
    je rappelle que pour ce tu devras d'abord rendre le menuitem de ta Form1 public

  14. #14
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Fally, pour une fois je ne suis pas tout à fait d'accord avec toi

    L'idée de la programmation objet est d'encapsuler des comportements. Or le fait de griser ou pas un menu dans une form F1 n'a aucune raison d'être fait dans une form F2. Toute la logique relative à ce menu devrait être localisée en un seul endroit F1.

    Parce que si un jour tu n'utilises plus un menu mais un bouton (par exemple), tu devras modifier F1 et F2. Moins les forms se connaissent, plus leur interface commune est réduite, plus on facilite les évolution futures.

    Aityahia, je détaille donc ce que je disais tout à l'heure : tu as un menu, avec une méthode abonnée à l'événement click de ce menu. Dans le code généré par le designer, tu as donc tonMenu.Click += taMethodeDeGestioDuClick. taMethodeDeGestioDuClick est une méthode de ta form abonnée à un event de ton menu ; le déclenchement de l'event du menu déclenche toutes les méthodes abonnées, donc entre autres taMethodeDeGestioDuClick.

    Là, ce que tu veux, c'est que la fermeture de ta form fille réactive le menu ; après avoir créé ta form fille, tu y abonnes une fonction qui va bien, de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void taMethodeDeGestioDuClick(object sender, EventArgs e)
    {
      tonMenu.Enabled = false;
      FormFille f = new FormFille();
      f.Closed += this.ReactiverMenu;
      f.Show();
    }
     
    private void ReactiverMenu(object sender, EventArgs e)
    {
      tonMenu.Enabled = true;
    }
    L'avantage, c'est que ta form fille ignore complètement cette logique. Plus généralement, autant que possible, il vaut mieux éviter aux composants / aux classes d'interagir directement, nommément avec leurs appelants, de façon à les rendre le plus générales et réutilisables que possible.

  15. #15
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Fally, pour une fois je ne suis pas tout à fait d'accord avec toi
    Moi je suis tout a fait d'accord avec toi
    Effectivement, il est plus efficace et "normal" de procéder comme tu l'as décrit car il c'est plus facile après de gérer les bug ou d'ajouter du code
    Tout se passe sur la form F1 et inutile dans ce cas de "public" le menuItem (ce que je cherchait Aityahia)

  16. #16
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    merci gluuh
    très bonne approche.

    je vais testé ça.

  17. #17
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Ok ça marche, le plus important dans tout ça c'est que j'ai saisi le principe.

    et merci encore @+.

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

Discussions similaires

  1. changer la fiche principale
    Par gdrean dans le forum Débuter
    Réponses: 4
    Dernier message: 08/09/2010, 14h48
  2. Réponses: 7
    Dernier message: 04/09/2010, 12h51
  3. Libérer une fiche principale
    Par ProgD dans le forum Delphi
    Réponses: 4
    Dernier message: 23/07/2007, 12h38
  4. Fiche principale <> Fiche identification
    Par yamino dans le forum Delphi
    Réponses: 11
    Dernier message: 10/06/2007, 18h30
  5. Déplacer fiche principale à l'exécution
    Par PyRoFlo dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/08/2004, 18h15

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