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 :

datagrid cell events wpf c#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 48
    Par défaut datagrid cell events wpf c#
    Bonjour,

    Je travaille actuellement sur une application en wpf c#.
    J'ai défini un datagrid et je fais un binding d'une liste d'éléments dessus.
    J'aimerai ajouter un événement sur mon datagrid qui me permettrait de recupérer le contenu d'une cellule grâce au clic de la souris.

    Pour l'instant j'ai tésté quelques exemples trouvés sur les forums et blogs. J'arrive juste à recupérer tous les éléments d'une ligne mais pas d'une cellule.

    Voici un bout de code qui me permet de faire ça.
    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
     
     private void myDatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
            {
                foreach (var item in e.AddedCells)
                {
                    var col = item.Column as DataGridColumn;
                    var fc = col.GetCellContent(item.Item);
     
                    if (fc is TextBlock)
                    {
                        MessageBox.Show("Values: " + (fc as TextBlock).Text);
                    }
                }
     
     
            }
    J'ai aussi:

    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
     
     private void myDatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
            {
              //  var p = (sender as DataGrid).CurrentItem;
                //MessageBox.Show(p);
                foreach (DataGridCellInfo cellInfo in myDatagrid.SelectedCells)
                {
                    // this changes the cell's content not the data item behind it
                    DataGridCell gridCell = TryToFindGridCell(myDatagrid, cellInfo);
                    if (gridCell != null)
                    {
                        int i = gridCell.Column.DisplayIndex;
                        TextBlock tb = gridCell.Content as TextBlock;
                        // gridCell.Background = Brushes.Red;
                        //gridCell.Content = "changed!!!";
                        MessageBox.Show("i   " + tb.Text);
                    }
     
     
                }
            }
     
            static DataGridCell TryToFindGridCell(DataGrid grid, DataGridCellInfo cellInfo)
            {
                DataGridCell result = null;
                DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item);
                if (row != null)
                {
                    int columnIndex = grid.Columns.IndexOf(cellInfo.Column);
                    if (columnIndex > -1)
                    {
                        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
                        result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
                    }
                }
                return result;
            }
     
            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
    j'ai d'abord utilisé l'event MouseDown mais ça ne fonctionne pas sur les cellules de mon datagrid. Auriez vous des suggestions qui me permettrait de recupérer une cellule donnée grace au click?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Si tu veux juste récupérer la valeur, c'est assez simple. Pour l'exemple j'ai créé une classe DataItem comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class DataItem
    {
    	public int Id { get; set; }
    	public string Name { get; set; }
    	public string A { get; set; }
    	public string B { get; set; }
    	public string C { get; set; }
    }
    Je génère une List<DataItem> que je bind sur mon DataGrid. Ensuite je m'abonne à l'évènement MouseLeftButtonUp, comme suit :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dataGrid1.MouseLeftButtonUp += new MouseButtonEventHandler(dataGrid1_MouseLeftButtonUp);
    Enfin dans le délégué je récupère l'Item de la cellule sélectionnée, qui correspond à l'objet DataItem bindé :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void dataGrid1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
    	var dataGrid = (DataGrid)sender;
    	var selectedItem = (DataItem)dataGrid.CurrentCell.Item;
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 48
    Par défaut
    Bonjour,

    merci beaucoup pour votré réponse. J'arrive à recupérer cellule par cellule maintenant en faisant les tests sur mes header, ce qui me permet de déterminer la colonne courante et de recupérer mon élément.

    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
     
     
     private void mydatagrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                var dataGrid = (DataGrid)sender;
                var selectedItem = (DataItem)dataGrid.CurrentCell.Item;
                DataGridColumn column = dataGrid .CurrentCell.Column;
                String header = column.Header.ToString();
                if (header.Equals("Titre"))
                {
                    String elem = selectedItem.Titre;
                    MessageBox.Show(elem);
                }
                else if (header.Equals("Nom"))
                {
                    String er = selectedItem.Nom;
                    MessageBox.Show(elem);
                }
     
            }
    encore merci pour tout

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Je pense qu'il serait intéressant pour toi de t'intéresser au databinding, comme te l'as suggéré DotNetMatt...

    Mais si tu veux vraiment taper dans le control, bosser sur les noms de controles n'est pas judicieux.
    Si tu changes de nom...

    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
     
    private void mydatagrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var dataGrid = (DataGrid)sender;
        var selectedItem = (DataItem)dataGrid.CurrentCell.Item;
        DataGridColumn column = dataGrid .CurrentCell.Column;
     
        var content = column.GetCellContent(selectedItem);
     
        if(content is TextBlock)
        {
             MessageBox.Show(((TextBlock)content).Text);
        }
     
     
    }

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/08/2014, 21h32
  2. Probléme modification datagrid vers BDD-WPF
    Par Damiens29 dans le forum C#
    Réponses: 0
    Dernier message: 03/05/2013, 12h05
  3. Datagrid cell value changed
    Par epiouf dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 17/08/2009, 14h04
  4. [Vb.net] Datagrid.cell n'existe pas ?
    Par dyree dans le forum ASP.NET
    Réponses: 9
    Dernier message: 14/06/2006, 10h26
  5. [VB.NET] Recuperer numero ligne dans DATAGRID apres event
    Par stephane93fr dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 11h58

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