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 :

SourceControl d'un ContextMenu non retrouvé par VS


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut SourceControl d'un ContextMenu non retrouvé par VS
    Bonjour à tous,

    Depuis quelques jours, je galérais pour faire fonctionner un ContextMenu et après de long effort, laedit a enfin réussi à trouver une solution.

    Pourquoi je vous parle de ça ? Car ça a un rapport direct avec mon problème actuel. En effet, une fois le problème de la remontée de l'arborescence du ContextMenu résolu, un autre problème est apparu... Visual Studio ne retrouve pas le SourceControl du ContextMenu.

    Le ContextMenu, le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ContextMenu  --> ToolStripMenuItem 1 ---> ToolStripMenuItem 1
                                         ---> ToolStripMenuItem 2
                                         ---> ...
                                         ---> ToolStripMenuItem n
                 --> ToolStripMenuItem 2
    Il est activé quand je fais un clic droit sur une PictureBox et le code suivant s'effectue quand je clique sur un ToolStripMenuItem de "Niveau 2" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void PoseCarte_Click(object sender, EventArgs e)
    {
        ToolStripDropDownItem tsddi = sender as ToolStripDropDownItem;
        ToolStripMenuItem TSMI = tsddi.Owner as ToolStripMenuItem;
        ContextMenuStrip id = TSMI.Owner as ContextMenuStrip;
        PictureBox id_PB = id.SourceControl as PictureBox;
    }
    Et là, j'ai un beau plantage de l'application car la variable id_PB vaut null. Il ne "sait pas" remonter au SourceControl.

    Ce qui est étonnant car autre part dans mon code, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    poserUneCarteToolStripMenuItem.Enabled = poserUneCarteToolStripMenuItem.HasDropDownItems;
                ContextMenuStrip Item = sender as ContextMenuStrip;
                PictureBox Item_PB = Item.SourceControl as PictureBox;
                retirerLaCarteToolStripMenuItem.Enabled = Item_PB.Image != null;
    Et là, pas de plantage. Le SourceControl est reconnu.

    Une idée ?

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Citation Envoyé par Tuttu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void PoseCarte_Click(object sender, EventArgs e)
    {
        ToolStripDropDownItem tsddi = sender as ToolStripDropDownItem;
        ToolStripMenuItem TSMI = tsddi.Owner as ToolStripMenuItem;
        ContextMenuStrip id = TSMI.Owner as ContextMenuStrip;
        PictureBox id_PB = id.SourceControl as PictureBox;
    }
    Et là, j'ai un beau plantage de l'application car la variable id_PB vaut null. Il ne "sait pas" remonter au SourceControl.
    Ce n'est pas id_PB qui fait planter l'application vu que cette variable n'est pas utilisée. Le problème vient forcément des demandes de cast précédents à moins qu'il y avait du code qui suivait la création de cette variable. Dans ce code ci la seule exception susceptible d'être lancée serait NullReferenceException par tsddi, TSMI ou id.

  3. #3
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Je n'ai pas mis cette ligne de code mais elle est à la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show(id_PB.Name.ToString());
    J'ai une NullReferenceException sur id_PB à cette ligne.

  4. #4
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    En fait, c'est la propriété SourceControl du ContextMenuStrip qui est nulle.

    La question étant : pourquoi est-elle nulle alors que si l'arborescence est plus petite (une ContextMenuStrip contenant des ToolStripMenuItem mais eux ne contiennent rien), elle est renseignée ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Dit comme ça, c'est plus clair. En effet, c'est la propriété SourceControl qui vaul null. Et Visual Studio me l'affiche de partout dans le debugger qu'elle vaut null, y a pas de soucis.

    Et comme le dit laedit, pourquoi vaut-elle null ? Je n'arrive pas à l'expliquer !

  6. #6
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Sujet résolu.

    C'est un bug connu de Microsoft. Voir cette page. Heureusement, il est considéré comme résolu dans VS 2010. Considéré seulement. Le reporter a encore le même problème avec la bêta 1.

    Sur ce coup là, je n'ai pas de chance. Heureusement, certain ont proposé des solutions de contournement. Je vais tâcher d'en faire bon usage.

    Merci à vous pour votre aide.

    EDIT : je viens de mettre en place une des solutions d'échappement and It works fine !

  7. #7
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Tu renseigne un champ privé avec le SourceControl lors du clic-droit ?
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  8. #8
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Durant l'événement DropDownOpened, je stocke le SourceControl dans une variable de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Control MonSourceControl = null;
            private void MenuTestToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
            {
             MonSourceControl = MonContextMenu.SourceControl;
            }

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

Discussions similaires

  1. Impossible d'accéder aux tables non créées par dbo
    Par Pete dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/10/2005, 14h01
  2. fonction utilisateur non reconue par sql server 2000
    Par ouedmouss dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2005, 07h46
  3. [API]JTAPI non reconnu par eclipse
    Par julio84 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/04/2005, 14h03
  4. [Lomboz] [JBoss] JBoss 3.2.6 non reconnu par Lomboz ?
    Par romain3395 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 17/12/2004, 16h35
  5. [CR] Grouper des minutes par cinq et non une par une.
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/09/2004, 13h45

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