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 :

forcer la selection d'un noeud dans un treeview [Débutant(e)]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut forcer la selection d'un noeud dans un treeview
    Bonjour,

    Je possède une treeview, et l'utilisateur à la possibilté de rajouter des noeuds. Pour celà, j'utilisais "SelectedNode " en winform afin de sélectionner le noeud ajouter une fois le tout validé.
    Actuellement, je suis embarasser avec "SelectedItem" qui ne sert qu'a obtenir le noeux actuelle, et ne permet plus de forcer la selection.

    Y'aurais t'il un autre moyen ?

    Merci d'avance

  2. #2
    Membre habitué Avatar de ToshiroSama
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 77
    Points : 131
    Points
    131
    Par défaut
    Pour les treeNode tu as la propriété Selected que tu peux mettre a True nn ?
    Face your fears, live your life

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    Oui, je ne veux pas dire de bétise, mais maintenant, les treeNode sont des treeViewItems, donc je n'est pas le propriété Selected, j'ai seulement selectedItem qui ne sert qu'a récupérer l'item selectionné, je ne peut pas le modifier avec .

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

    SelectedItem est en lecture seule, donc il n'est pas possible de passer par là.
    Dans mon cas, j'ai redéfini une classe héritant de treeview afin de rajouter une propriété dépendante sur le graphique. Ainsi tu bindes SelectedItem dans ta ViewModel et en lui assignant une valeur, il est automatiquement sélectionné dans l'arbre !
    Bon c'est un mix de plusieurs trucs trouvés sur internet

    D'abord la création de la classe avec un event sur le SelectedItemChanged


    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
    public class TreeView : System.Windows.Controls.TreeView
        {
     
            public TreeView()
            {
                //on lève l'event de la sélection
                this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(TreeViewEx_SelectedItemChanged);
            }
     
            public void TreeViewEx_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                //assignation de la nouvelle valeur 
                this.SelectedItem = e.NewValue;
            }

    Une propriété dépendante pour le SelectedItem en non read only


    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public new static readonly DependencyProperty SelectedItemProperty =
                DependencyProperty.Register("SelectedItem",
                                            typeof(object),
                                            typeof(TreeView),
                                            new PropertyMetadata(SelectedItemProperty_Changed));
     
    /// <summary>
    /// Event au changement de la valeur du SelectedItem
    /// </summary>
    /// <param name="dependencyObject">Propriété dépendante "SelectedItem"</param>
    /// <param name="e">Event</param>
    public static void SelectedItemProperty_Changed(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
    {
       TreeView trv = dependencyObject as TreeView;
        if (trv != null)
         {   //on cherche le noeud dans le treeview
          TreeViewItem tvi = trv.GetNode(trv.SelectedItem) as TreeViewItem;             
          //sélection du noeud (visible dans l'IHM
          if (tvi != null)
          tvi.IsSelected = true;
                }
            }
     
    /// <summary>
    /// masque sur la propriété SelectedItem de base
    /// </summary>
    public new object SelectedItem
    {
        get 
        { 
           return this.GetValue(TreeView.SelectedItemProperty); 
         }
         set 
        { 
            this.SetValue(TreeView.SelectedItemProperty, value); 
         }
    }

    Et ensuite les méthodes pour parcourir l'arbre de manière récursive

    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
    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
    58
    59
    60
     
    /// <summary>
         /// Recherche d'un noeud correspondant à un objet
         /// </summary>
         /// <param name="item">Objet à chercher</param>
         /// <returns>Noeud trouvé</returns>
         public TreeViewItem GetNode(object item)
         {
             TreeViewItem node = null;
     
             List<object> ItemList = this.Items.Cast<Object>().ToList();
     
             foreach (object data in this.Items)
             {
                 node = this.ItemContainerGenerator.ContainerFromItem(data) as TreeViewItem;
                 if (node != null)
                 {
                     if (data == item)
                         break;
                     node = GetNodeInChildren(node, item);
                     if (node != null)
                         break;
                 }
             }
             return node;
         }
     
    /// <summary>
    /// Recherche d'un noeud dans un TreeviewItem (récursif)
    /// </summary>
    /// <param name="node">Node à explorer</param>
    /// <param name="item">Objet à trouver</param> 
    /// <returns>Noeud</returns>
    protected TreeViewItem GetNodeInChildren(TreeViewItem node, object item)
            {
                TreeViewItem tvi = null;
                bool isExpanded = node.IsExpanded;
                //expand le node si besoin (obligé pour chercher dedans)
                if (!isExpanded)
                {
                    node.IsExpanded = true;
                    node.UpdateLayout();
                }
                //recherche dedans de manière récursive
                foreach (object data in node.Items)
                {
                    tvi = node.ItemContainerGenerator.ContainerFromItem(data) as TreeViewItem;
                    if (data == item && tvi != null)
                        break;
                    tvi = GetNodeInChildren(tvi, item);
                    if (tvi != null)
                        break;
                }
                //referme le node si ouvert pour la recherche (=aspect initial)
                if (tvi == null && node.IsExpanded != isExpanded)
                    node.IsExpanded = isExpanded;
                if (tvi != null)
                    node.IsExpanded = true;
                return tvi;
            }

    et pour finir tu peux binder le fameux SelectedItem

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <control:TreeView x:Name="treeViewElements" SelectedItem="{Binding SelectedObject, Mode=TwoWay}">

    Voilà, j'espère que cela t'auras aider.
    C'est un peu lourd comme système à mon goût, je pense qu'il doit y avoir d'autres méthodes mais à l'époque, ça m'avait bien dépanner

    @+ et bon courage

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    C'est vrai que c'est un peut lourd, mais je pense que ce sont justement les avantage de modification que nous offre le wpf (il me semble ), par contre, je code en vb.net, et même si j'y suis un tout petit peut plus familiariser que le wpf, je n'arrive pas à retranscrire correctement la ligne concernant l'handler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(TreeViewEx_SelectedItemChanged);
    Débuter sur plusieur front à la fois, c'est le top

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

    Il existe des convertisseurs sur internet pour passer du c# au vb.net
    Je ne te garanti pas le résultat mais ça donne

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.SelectedItemChanged += New RoutedPropertyChangedEventHandler(Of Object)(TreeViewEx_SelectedItemChanged)

    Source :
    http://www.developerfusion.com/tools.../csharp-to-vb/

    @+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    re,
    En faite je me suis déja servis à plusieur reprise des convertisseur, en particulier de celui que tu me montre qui est ultra complet pour transformer quelque chose d'inconnus niveau sinthaxe. Il gère casiment tout, même lorsque l'on joue sur la casse pour différencier les variables et les méthodes en C#. Mais son petit bémol reste sur les incrémentations d'andhler (eu, je veut dire le += ou -=, j'ai perdu le nom que sa porte lol) qui ne sont pas retranscrit de la bonne manière (surment un problème avec tous les raccourcis qui peuvent ce faire avec un += ou -=).

    Donc j'ai bien vue comment réaliser un eventHandler en Vb, mais c'est vrai que je n'est pas vus avec autant de particularité que le tiens , En tout cas merci pour sa, en rentrant dans le code sa m'a bien l'aire fonctionnelle.

    Je vais voir pour me dépatouiller avec ça.

    Merci en tout cas, sa va me débloquer un peut déjà

  8. #8
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Re,

    Désolé je ne connais pas trop le Vb.Net
    De mémoire, tu dois pouvoir jouer avec un truc dans le genre

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler myobj.myEvent, AddressOf MyEventHandler

    Bon, sinon google est ton ami

    Hésite pas si tu as besoin

    @+

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    oui oui, merci de ton aide, j'avais fait la même chose et sa me bloquais, d'où mon interrogation .
    Mais justement je tatonne sur google, et je reposterais la réponse en validant le résolut.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    Et je n'histerais pas, je repasserais surement sur le forum rapidement, car j'ai quelque méthode écrite en form que je retranscrit (comme je peut) en wpf, ou au moins intégrable en wpf, donc sur certains point comme celui la, je me sens encore loin de réaliser le changement tout seul en wpf (vraiment récent pour moi, mais avec de l'aide les fofo, et les tuto que l'on ma déja bien fournis, j'avance à petit pas

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    Voila, problème résolue, j'avais un ".click" que j'ai mis pour je ne sais qu'elle raison à la suite de l'évennement SelectedItemChanged .
    Donc, comme d'habitude, il s'agit d'erreur bête que je fais .

    Merci bien, sa va m'être très utile

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 62
    Points
    62
    Par défaut
    Bon, j'ai un dernier souci avec ceci :
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyMetadata(SelectedItemProperty_Changed)
    on me dit
    Agrument not specified for parameter 'dependencyObject' of ...
    .

    J'avoue qu'avec PropertyMetadata, je suis pas trop sur des détail et de se que je trouve dessus, alors je préfère posé la question là au cas où

  13. #13
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Bonjour,

    N'aurais tu pas oublié un truc lors de la réécriture en VB.Net
    Car avec ce que je t'ai donné, ça marche en c# ...

    Essaie de revoir la traduction peut être

    En fait pour faire simple, cette partie permet de spécifier la méthode lorsque la propriété dépendant SelectedItem est modifiée (nouveau noeud sélectionné par exemple).
    C'est peut être dans le code pour déclarer la propriété dépendante que ça merdouille....

Discussions similaires

  1. [AC-2007] forcer selection d'un noeud dans un treeview
    Par santacrus dans le forum VBA Access
    Réponses: 3
    Dernier message: 21/03/2010, 18h16
  2. Forcer l'édition d'un noeud dans un tree
    Par House MD dans le forum Flex
    Réponses: 0
    Dernier message: 14/04/2009, 14h59
  3. [VB.NET] Trouver noeud dans un TreeView
    Par PM_calou dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/10/2006, 17h42
  4. [VB]Déplacer un noeud dans un TreeView
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/11/2005, 18h27
  5. Pbs pour Glisser-Deplacer des noeuds dans un TreeView.
    Par psau dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/09/2004, 21h02

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