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 Presentation Foundation Discussion :

Context menu sur un datagrid


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut Context menu sur un datagrid
    Bonjour,

    j'aimerais que lorsque je clique sur une ligne de mon datagrid, j'ai un contextmenu qui s'affiche mais je ne trouve pas la solution ou plutot partiellement.

    J'ai créé mon contextmenu comme suit :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <DataGrid.ContextMenu>
                        <ContextMenu >
                            <MenuItem Header="Add Divider"  />
                        </ContextMenu>
    </DataGrid.ContextMenu>

    Et dans le handler MouseDown (j'ai aussi essayé MouseLeftButtonDown) j'ai juste mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dataGrid1.ContextMenu.IsOpen = true;
    Sauf que ce code ne fonctionne que lorsque j'ai sélectionné ma ligne :
    Je dois cliquer sur une ligne (ça la selectionne) et ensuite recliquer pour afficher le contextMenu.

    Comment faire pour que ça se fasse directement ? Au premier clic quoi.


    J'ai essayé de rajouter ça dans le datagrid.rowstyle et dans le datagrid.cellstyle :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="IsSelected" Value="True"/>
    </Trigger>
    Sans succès, du coup je suis un peu bloqué, si vous pouviez m'aider.

    Merci d'avance,

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Salut PigKey6

    Définis ton ContextMenu dans les ressources de ta page

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Window.Resources> 
    <ContextMenu x:Key="cm" >
     <MenuItem Header="Add Divider"  />
    </ContextMenu>
    </Window.Resources>

    Ensuite génére la méthode DataGrid_MouseRightButtonUp sur ton datagrid

    Code c# : 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
    private void DataGrid_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    {
    	DependencyObject dep = (DependencyObject)e.OriginalSource;
     
    	while ((dep != null) &&
    			!(dep is DataGridCell) &&
    			!(dep is DataGridColumnHeader))
    	{
    		dep = VisualTreeHelper.GetParent(dep);
    	}
     
    	if (dep == null)
    		return;
     
    	if (dep is DataGridCell)
    	{
    		while ((dep != null) && !(dep is DataGridRow))
    		{
    			dep = VisualTreeHelper.GetParent(dep);
    		}
     
    		DataGridRow dgrow = dep as DataGridRow;
    		ContextMenu cm= (ContextMenu)this.FindResource("cm");
                    //tu récupère ton item sélectionné dans ton datagrid
    		cm.DataContext = dgrow.Item as TonObjetSource;                    
    		dgrow.ContextMenu = cm;		
    	}	
    }

    Autre exemple

    En espérant t'avoir aidé...

    Bonne journée et bon code !

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut
    Merci pour ta réponse !
    J'ai un peu de mal à tout saisir, notamment TonObjetSource à quoi ça correspond ?

  4. #4
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Salut,

    En gros le but de la méthode est de récupérer l'item sur lequel tu as cliqué : en l’occurrence sur ton datagrid, il s'agit d'un datarow.

    Ton datagrid a comme source de donnée (ItemsSource) une collection d'objet de type T normalement !

    cm.DataContext = dgrow.Item as TonObjetSource;

    Dans mon exemple, cm correspond à mon ContextMenu : je souhaite lui passer en paramètre l'objet contenu dans le datarow sélectionné. C'est pour cette raison que je dois le caster en TonObjetSource : toi tu dois remplacer ca par le type d'objet contenu dans ton datagrid.

    C'est plus clair pour toi ?

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 66
    Par défaut
    Oui merci ça va mieux

    J'ai juste un dernier point qui me dérange pour le moment :
    J'aimerais afficher ce context menu que si je clique sur la 7ème colonne ou la 6ème. (ou plutot sur la 7ème cell d'une ligne)

    Cependant je n'arrive pas à récupérer l'index de la colonne.

    J'ai essayé :
    -De caster la variable dep en DatagridCell puis faire un dep.Column.DisplayIndex, mais ça me renvoie toujours 0.
    - J'ai essayé des trucs plus obscurs de divers forums sans succès, j'obtiens toujours la valeur/index de la première colonne.

    Merci

  6. #6
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Salut,

    En reprenant mon précédant exemple de code :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (dep is DataGridCell)
    {
       int index = (dep as DataGridCell).Column.DisplayIndex;
    ....

    @+

Discussions similaires

  1. Context menu sur expandable listview de plusieurs niveaux
    Par Willy55 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 13/03/2015, 10h34
  2. Dissocier l'alignement d'un datagrid de son context menu
    Par boubou38 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 26/07/2012, 14h46
  3. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  4. Context menu Windows - icone pour un item
    Par Cameleon45 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 07/03/2003, 13h48
  5. Context Menu - ( Code de P. Castelain )
    Par Cameleon45 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 06/03/2003, 22h33

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