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

Silverlight Discussion :

[SL4] Détecter et RAZ Datagrid


Sujet :

Silverlight

  1. #1
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut [SL4] Détecter et RAZ Datagrid
    Bonjour,

    J'aimerais dans ma page détecter si un changement a été fait sur un DataGrid de façon assez "générique".
    C'est à dire que je ne veux pas déclencher des évènements pour traiter à l'intérieur si je suis en édition ou pas...

    La 1ère idée est d'hériter du DataGrid et traiter ces évènements dans un composant à part.
    Mais j'ai pas envie d'en hériter, j'aimerais le laisser "tel quel".

    D'ou ma question : existe-t-il une propriété ou un seul événement magique capable de me dire si mon datagrid à été édité (ligne modifiée, supprimée etc..) depuis son chargement ?

    Accessoirement existe-t-il une commande sur le datagrid qui permet de le recharger avec ses données initiales ?

    Je n'ai rien trouvé de tout ça...

    En vous remerciant pour vos réponses,

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par stailer Voir le message
    D'ou ma question : existe-t-il une propriété ou un seul événement magique capable de me dire si mon datagrid à été édité (ligne modifiée, supprimée etc..) depuis son chargement ?
    Tu peux t'abonner au CollectionChanged de la collection qui a rempli ton DataGrid ainsi qu'au PropertyChanged des items.

    Accessoirement existe-t-il une commande sur le datagrid qui permet de le recharger avec ses données initiales ?
    Remettre la collection initiale dans son ItemsSource.

  3. #3
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Ok, j'aurais préféré une propriété "CollectionChanged" mais tant pis.

    Je vais faire un héritage du DataGrid et rajouter une DependencyProperty CollectionChanged que je peux affecter ou récupérer.

    Merci pour ta réponse,

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par stailer Voir le message
    Ok, j'aurais préféré une propriété "CollectionChanged" mais tant pis.

    Je vais faire un héritage du DataGrid et rajouter une DependencyProperty CollectionChanged que je peux affecter ou récupérer.

    Merci pour ta réponse,
    Évite l'héritage. Essaye plutôt avec une propriété attachée (Attached Property).

  5. #5
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Tu es sur que je peux éviter l'héritage ?
    Je viens de regarder les AttachedProperty.. Ok mais dans l'exemple ici :

    http://www.silverlightshow.net/tips/...lverlight.aspx

    Il fait bien un héritage du StackPanel.

    En fait le souci est qu'il faut bien que je lève le CollectionChanged pour déterminer si quelque chose à changer ou pas.

    Et je dois bien ajouter un CollectionChanged pour récupérer la propriété dans un autre traitement.. Ou alors on peut faire autrement ? mais je ne connais pas la méthode

  6. #6
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ben tu peux créer 2 attached properties : MyItemsSource (IEnumerable) et CollectionChanged (bool).

    Lorsque MyItemsSource est modifié, d'abord tu set le ItemsSource du DataGrid et ensuite tu t'abonnes à CollectionChanged (si c'est une INotififyCollectionChanged) puis pour chaque item tu t'abonnes à PropertyChanged (si INotifyCollectionChanged).

    Dans chacun des deux events, tu passes le booléen CollectionChanged à true. Cette propriété est bindée en TwoWay sur un booléen de ton ViewModel, qui fait ton action quand il passe à true.

    C'est juste une idée, je sais pas si ça réponds à ton besoin.

  7. #7
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Ca m'a l'air de répondre à mon besoin mais ces attached properties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyItemsSource (IEnumerable) et CollectionChanged (bool)
    je les mets ou ? si je n'hérite pas du datagrid standard, à quel endroit les mettre ?

    Je cherche à être le plus générique possible et je préfère éviter d'avoir à répéter du code dans le code behind à chaque fois que je pose un datagrid.
    L'idée est surtout de faire comme je l'ai fait pour les TextBox ou Checkbox : détecter un changement automatiquement.

    Pas de souci sur ces 2 composants, il y a le Text sur le premier et le IsChecked sur le second. Pour le DataGrid c'est plus compliqué, il n'y a pas de "valeur" à proprement parler.

    Donc je vais prendre ta solution mais sans héritage je ne comprends pas ou copier ces attached properties. Si je fais une classe à part comment alors la rattacher avec le datagrid ?


    -------------------------------
    EDIT : je viens de faire des recherches... et je viens de comprendre le principe du Attached Property. En fait bizarrement, j'appelais ça des "helpers" moi

    Bref, l'idée et les possibilités sont attrayantes. Pourquoi pas en effet même si je sais pas si je maitrise assez bien le concept pour me lancer assez rapidement dedans

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu peux les mettre dans une classe static du genre DataGridExtensions

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static class DataGridExtensions
    {
       // tes AP ici
    }

    Pour créer une Attached Properties tu peux utiliser le snippet de VS "propa" (tu tapes propa et tu appuies 2 fois sur Tab).

    Tu devrais avoir un truc dans le genre

    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
    public static IEnumerable GetMyItemsSource(DataGrid obj)
    {
        return (IEnumerable)obj.GetValue(MyItemsSourceProperty);
    }
     
    public static void SetMyItemsSource(DataGrid obj, IEnumerable value)
    {
        obj.SetValue(MyItemsSourceProperty, value);
    }
     
    // Using a DependencyProperty as the backing store for MyItemsSource.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyItemsSourceProperty =
        DependencyProperty.RegisterAttached("MyItemsSource", typeof(IEnumerable), typeof(DataGridExtensions), new PropertyMetadata(OnMyItemsSourceChanged));
     
    private static void OnMyItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        DataGrid grid = sender as DataGrid;
     
        grid.ItemsSource = e.NewValue as IEnumerable;
    }

    Ensuite pour l'utiliser dans ton DataGrid

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <sdk:DataGrid local:DataGridExtensions.MyItemsSource="..." ... />

  9. #9
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    ok je commence à vraiment bien voir le truc.

    je vais donc également rajouter un CollectionChanged... Mais comment en revanche récupérer une valeur ?

    Par exemple, mon Datagrid1 n'a pas de propriété CollectionChanged. Du coup comment réussir à faire l'équivalent d'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       bool result = this.Datagrid1.CollectionChanged;
    Merci encore pour toutes ces infos

  10. #10
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    A priori ce serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.Datagrid1.GetValue(DataGridExtension.CollectionChanged) as bool;
    Bon, je crois que c'est vendu
    Je vais tenter tout ça. Merci beaucoup.

  11. #11
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Euh je sais pas si ça marche ça.

    Essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool res = DataGridExtensions.GetCollectionChanged(DataGrid1);

  12. #12
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Salut,

    Voici donc un premier extrait de code qui apparemment fonctionne bien et me permet de savoir si j'ai modifié mon datagrid ou pas de façon générique :

    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
     
     private static DataGrid dt;
            private static void ItemsSourceCosoluceCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                dt = sender as DataGrid;
                if (e.NewValue != null && e.NewValue is INotifyCollectionChanged)
                {
                    dt.ItemsSource = (IEnumerable) e.NewValue;
                    (dt.ItemsSource as INotifyCollectionChanged).CollectionChanged+=new NotifyCollectionChangedEventHandler(PageStatutExtensions_CollectionChanged);
     
                    foreach (object c in dt.ItemsSource)
                    {
                        (c as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(PageStatutExtensions_PropertyChanged);
                    }
                }
            }
     
     
     
     
            static void PageStatutExtensions_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                dt.SetValue(PageStatutExtensions.DataChangedProperty, true);
            }
     
     
            static void PageStatutExtensions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
            {
                dt.SetValue(PageStatutExtensions.DataChangedProperty, true);
            }

    Si je te montre ce code c'est parce que pour affecter à True mon booléen "DataChanged" j'ai du passer le DataGrid en private static
    (la variable "dt" ci dessus est le DataGrid au cas ou tu ne l'aurais pas repéré).

    Cela te parait il être du gros bricolage ou il n'y a pas vraiment d'autre solutions pour affecter le SetValue ?

    Merci pour l'intérêt que tu portes à ce post, j'ai pu super bien avancer.

  13. #13
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Le problème que je vois, c'est si tu utilises plusieurs DataGrid. Ta variable dt sera toujours le dernier DataGrid que tu as utilisé.

    Par contre tu peux profiter des "closure".

    Exemple :

    Tout d'abord tu vas mettre dt en tant que variable de ta méthode OnMyItemsSourceChanged.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGrid dt = sender as DataGrid;

    Puis au lieu de

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    (dt.ItemsSource as INotifyCollectionChanged).CollectionChanged+=new NotifyCollectionChangedEventHandler(PageStatutExtensions_CollectionChanged);

    Tu vas mettre

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    (dt.ItemsSource as INotifyCollectionChanged).CollectionChanged += (o, e2) => dt.SetValue(PageStatutExtensions.DataChangedProperty, true);

    (pareil pour le PropertyChanged)

    Tu vas utiliser un lambda directement dans ton OnMyItemsSourceChanged, et en profitant des "closures" (portée de variables avec les delegates anonymes), chaque fois que ton delegate sera executé il le sera avec son DataGrid.

    C'est un concept un peu bizarre mais ça devient rapidement pratique quand on l'a bien compris.

  14. #14
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Le problème que je vois, c'est si tu utilises plusieurs DataGrid.
    J'en étais sûr... Et je sentais bien la syntaxe de psychopathe arriver

    En effet c'est pas super intuitif mais je vais m'en imprégner et l'adpater à mon code. Dommage qu'il n'y ait pas un bouquin qui parle de tout ça en détail.


    EDIT ---------------

    Après modifs et tests du code, tout fonctionne parfaitement.

    Encore merci pour ton aide.. Presque une petite formation "à distance" j'ai envie de dire

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

Discussions similaires

  1. Détecter clic droit sur le header commun (lignes & colonnes) d'un datagrid
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 20/05/2011, 14h07
  2. datagrid : détecter la colonne cliquée
    Par errog dans le forum Flex
    Réponses: 2
    Dernier message: 04/09/2010, 06h49
  3. Détecter Windows 2000 Professionnel
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/11/2006, 23h02
  4. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37

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