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

C# Discussion :

index listbox avant ouverture contextmenu


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut index listbox avant ouverture contextmenu
    bonjour à tous,

    J'ai un listbox avec le drawMode = draOwnerDrawVariable.

    J'aurais souhaité vérifier un paramètre de mon item avant pour mettre à jour un menu contextuel par la méthode suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		void CtxMnuOpened(object sender, EventArgs e)
    		{
    	int indexItemClicked = listbox1.IndexFromPoint(cursor.position);
    		}
    Peux importe ou je click sur la listebox, la valeur indexItemClicked vaut toujours -1. Ca pose donc problème pour la selection de l'item puisque c'est hors des valeur du tableau.

    Comment peux-ton donc faire une mise à jour d'un context menu sur base d'une valeur de l'item?

  2. #2
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Cursor.Position retourne la position du curseur sur l'ecran, alors que IndexFromPoint attend les coordonnées dans la listbox, si je ne dis pas de bêtise.
    Essaye de récupérer la position de la souris d'une autre manière, par exemple dans l’événement MouseDown.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            private void listBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    listBox1.SelectedItem = listBox1.Items[listBox1.IndexFromPoint(e.X, e.Y)];
                    contextMenuStrip1.Items[0].Text = listBox1.SelectedItem.ToString();
                }
            }

  3. #3
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Et si tu tiens absolument à rester dans les événements du ContextStripMenu, essaye de gérer plutôt l’événement Opening, qui permet d'annuler l'ouverture du menu (si c'est un comportement souhaité pour ton application, bien entendu):

    Voir la documentation MSDN de la méthode PointToClient et celle de l'événement Opening

    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
            private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)        
            {
                Point p = new Point();
     
                //récupère la position du curseur, et retourne les coordonnées dans le référentiel de la Form active
                p = PointToClient(System.Windows.Forms.Cursor.Position);
     
                // ajuste la position du point en prenant en compte la position de la ListBox
                p.X = p.X - listBox1.Location.X;
                p.Y = p.Y - listBox1.Location.Y;
     
                // Vérifie l'existence d'un objet à ces coordonnées
                if (listBox1.IndexFromPoint(p) != -1)
                {
                    // traitement en cas de succès
                    listBox1.SelectedItem = listBox1.Items[listBox1.IndexFromPoint(p)];
                }
                else
                {
                    // si c'est -1, on annule l'ouverture du menu
                    e.Cancel = true;
                }
            }

  4. #4
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Merci pour les pistes je regarderai tout ça ce soir.

    @nouanda :

    j'aurais effectivement souhaité rester dans les evenement du contextmenu pour faciliter la gestion mais les evenement ne possède pas de e.x et e.y afin de positionner le click.
    Le but n'est pas d'annuler le contextmenu mais bien de faire :
    item verrouillée affichage dans le contexrtmenu de déverrouiller
    item déverrouillée affichage dans le contextmenu verrouiller
    et n aucun cas de l'annuler.

  5. #5
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Ok, je suis pas sur d'avoir compris... Si tu veux switcher un statut verrouillé/déverrouillé, il faut que tu sois sûr d'être sur un item de ta liste. Donc je te conseillerais de ne pas montrer le contextmenu si l'utilisateur ne clique pas sur un item (et donc d'utiliser Opening plutôt que Opened).
    En outre, si tu dois apporter des modifications au menu contextuel, il vaut mieux le faire avant de le montrer. Donc définitivement, Opening est plus adapté.

  6. #6
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    ok impeccable juste ce qu'il me fallait: voici le code final

    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
    		private void CtxMnuOpening(object sender, CancelEventArgs e)
    		{
    			if(ItemListBox.Items.Count == 0)
    			{
    				e.Cancel = true;
    			}
    			else
    			{
    				Point p = new Point();
    				p = PointToClient(Cursor.Position);
     
    				p.X = p.X - listbox1.Location.X;
    				p.Y = p.Y - listbox1.Location.Y;
     
    				int index = listbox1.IndexFromPoint(p);
     
    				if (index != -1)
    				{
    					ItemListBox item = (ItemListBox)listbox1.Items[index];
    					if(dom.Verrouille == true)
    					{
    						ctxMnu.Items[3].Enabled = (item.Verrouille == true) false:true;
    						ctxMnu.Items[4].Enabled = (item.Verrouille == true) false:true;;
    					}
    				}
    				else
    				{
    					e.Cancel = true;
    				}
    			}
    		}
    merci pour l'aide et l'astuce du pointtoclient

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

Discussions similaires

  1. executer un programme avant ouverture session
    Par pitikak dans le forum Windows XP
    Réponses: 14
    Dernier message: 21/07/2007, 15h15
  2. Test avant ouverture de fichier
    Par Yves2507 dans le forum Access
    Réponses: 6
    Dernier message: 10/09/2006, 09h57
  3. [VBA-E] Remplir une listbox à l'ouverture d'un formulaire
    Par fred bx dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/06/2006, 13h25
  4. Bouton submit grisé avant ouverture lien
    Par Ben42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/01/2006, 17h04

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