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 :

Selection d'un enfant dans treeviewitem


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 33
    Par défaut Selection d'un enfant dans treeviewitem
    Bonsoir à tous,

    j'ai un treeview wpf qui a des treeviewitem comme parent et chaque parent contient des datarowviews.

    Problème, j'arrive à sélectionner par le code les parents mais après je ne sais pas comment sélectionner un enfant (datarowview donc) bien précis.

    Pouvez-vous me dire comment je dois procéder s'il vous plait?

    Mon début de code...
    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
     
     if (nomParent == choixTypeArt)
    {                    
         TreeViewItem itemTreeview = (TreeViewItem)ArboTypeArt.ItemContainerGenerator.ContainerFromIndex(indexer);
         if (itemTreeview != null)
         {
              //selection du parent
              itemTreeview.Focus();
              itemTreeview.IsSelected = true;
              itemTreeview.IsExpanded = true;
     
              //on regarde s'il a des enfants
              bool child = itemTreeview.HasItems;
              if (child)
              {                  
                   int nbChild = itemTreeview.Items.Count;
                   for (int loop = 0; loop < nbChild; loop++)
                   {
                        DataRowView dtTree = (DataRowView) itemTreeview.Items[loop];
                        if (dtTree.Row[3].ToString() == txtRef.Text)
                        {
                              //ne marche pas ce que je comprend vu que c'est un datarowview, mais comment faire?
                              TreeViewItem itemTreeviewChild = (TreeViewItem)itemTreeview.Items.GetItemAt(loop);
     
                              if (itemTreeviewChild != null)
                              {
                                   itemTreeviewChild.Focus();
                                   itemTreeviewChild.IsSelected = true;
                              }
                          }
    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Remplace ça :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //ne marche pas ce que je comprend vu que c'est un datarowview, mais comment faire?
    TreeViewItem itemTreeviewChild = (TreeViewItem)itemTreeview.Items.GetItemAt(loop);

    Par ça :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataRowView childItem = (DataRowView)itemTreeview.Items.GetItemAt(loop);
    TreeViewItem itemTreeviewChild = (TreeViewItem)itemTreeview.ItemContainerGenerator.ContainerFromItem(childItem);

    En WPF, quand tu te bindes sur une collection, les éléments graphiques ne sont pas dans la collection Items ; celle-ci contient les données, et non leur représentation graphique. Il faut passer par le ItemContainerGenerator pour récupérer le container (le TreeViewItem en l'occurrence).

    Enfin de toutes façons cette approche est très peu pratique, comme tu as du le remarquer... Le mieux, autant que possible, c'est de le pas manipuler directement le TreeView, mais plutôt les données. Si tu peux, ajoute une colonne "IsSelected" de type bool dans la DataTable source, et bindes le IsSelected du TreeViewItem dessus :

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <TreeView ItemsSource=...>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            </Style TargetType="{x:Type TreeViewItem}">
        </TreeView.ItemContainerStyle>
    </TreeView>

    Ensuite il suffit de changer la valeur de cette colonne dans le DataRow pour sélectionner/déselectionner un noeud

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 33
    Par défaut
    Bonjour,

    Effectivement cela marche bien mais le problème est que le treeviewitem est toujours à null...
    Je n'arrive pas du tout à le remplir.
    Avez-vous une idée s'il vous plait?

    Merci et bonne journée à tous.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par miky77 Voir le message
    Effectivement cela marche bien mais le problème est que le treeviewitem est toujours à null...
    Je n'arrive pas du tout à le remplir.
    Euh... bah je comprends pas pourquoi tu dis que ça marche bien alors ?

    A quel niveau le TreeViewItem est nul ? Au retour de ItemContainerGenerator.ContainerFromItem ?

    En fait cette technique ne marche que si l'item est déjà visible ; par exemple, si le TreeViewItem parent n'est pas déplié, les containers ne sont pas encore générés... Bref, c'est vraiment galère de travailler directement avec les TreeViewItems. Tu ferais mieux d'utiliser la 2e approche que je t'ai indiquée, à base de binding

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 33
    Par défaut
    Je disais que ça marche bien dans le sens où je n'ai plus d'erreur...
    Mais oui effectivement ça ne marche pas parce que itemTreeviewChild est null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeViewItem itemTreeviewChild = (TreeViewItem)itemTreeview.ItemContainerGenerator.ContainerFromItem(childItem);
    (childItem lui est bien renseigné).

    Je comprend ce que tu veux que je fasse mais je ne vois pas comment l'adapter dans mon code actuel... (déjà que j'ai eu beaucoup de mal à faire ce que j'ai fait...).
    A quel niveau il faut que je fasse les modifications?

    Code behind qui remplit le treeview :
    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
     
     public void BindData()
            {
                //on remplit l'arborescence en récupérant les données par un seul et même dataset
                ArboTypeArt.DataContext = GetRelationalData();
            }
     
            // ------------------------------------------------------------------- 
            // --------- Remplit le dataset de l'arborescence
            public System.Data.DataSet GetRelationalData()
            {
                //cette fonction permet de récupérer les types d'articles, articles et propriétés externes à afficher dans l'arborescence 
                //avec un dataset remplit à partir de relations entre les différentes tables
     
                System.Data.DataSet dataSet = new System.Data.DataSet();
     
                string reqTypeArt = "SELECT * FROM TypeArticle ORDER BY Nom ASC;";
                System.Data.DataTable tableTypeArticle = Bd.GetTableRelationDataset(dataSet, reqTypeArt, "TypeArticle");
     
                string reqArt = "SELECT * FROM Articles ORDER BY Ref ASC;";
                System.Data.DataTable tableArticle = Bd.GetTableRelationDataset(dataSet, reqArt, "Articles");
     
                string reqPropExt = "SELECT * FROM PropExtParArticle PA, ProprieteExterne P WHERE P.IDProprieteExt = PA.IDProprieteExt;";
                System.Data.DataTable tablePropExt = Bd.GetTableRelationDataset(dataSet, reqPropExt, "PropExtParArticle");
     
                System.Data.DataColumn table1Column = dataSet.Tables[tableTypeArticle.TableName].Columns["IDTypeArticle"];
                System.Data.DataColumn table2Column = dataSet.Tables[tableArticle.TableName].Columns["IDTypeArticle"];
                System.Data.DataColumn table3Column = dataSet.Tables[tableArticle.TableName].Columns["IDArticle"];
                System.Data.DataColumn table4Column = dataSet.Tables[tablePropExt.TableName].Columns["IDArticle"];
     
                System.Data.DataRelation CategoryRelation;
                CategoryRelation = new DataRelation("childRelation", table1Column, table2Column);
                System.Data.DataRelation CategoryRelation2;
                CategoryRelation2 = new DataRelation("childRelation2", table3Column, table4Column);
     
                dataSet.Relations.Add(CategoryRelation);
                dataSet.Relations.Add(CategoryRelation2);
     
                return dataSet;
            }

    XAML
    Code xaml : 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
     
    <Window.Resources>
     
            <!-- treeview -->
            <DataTemplate x:Key="PropTemplate">
                <TextBlock Text="{Binding Nom}"></TextBlock>
            </DataTemplate>
            <HierarchicalDataTemplate x:Key="ArticleTemplate" ItemsSource="{Binding childRelation2}" ItemTemplate="{StaticResource PropTemplate}">
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="IsEnabled" Value="false"/>
                    </Style>
                </HierarchicalDataTemplate.ItemContainerStyle>
                <TextBlock Text="{Binding RefFournisseur}">
                    <TextBlock.ContextMenu>
                        <ContextMenu>
                            <MenuItem Name="SupprArtArbo" Header="Supprimer cet article" Click="btnValidSupprArt_Click"/>
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate x:Key="TypeArticleTemplate" ItemsSource="{Binding childRelation}" ItemTemplate="{StaticResource ArticleTemplate}">
                <TextBlock Text="{Binding Nom}"></TextBlock>
            </HierarchicalDataTemplate>
     
        </Window.Resources>

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     <TreeView Grid.Row="1" Grid.Column="0" VerticalAlignment="Top" HorizontalAlignment="Left" Name="ArboTypeArt" Style="{StaticResource TreeG}"
                                          ItemsSource="{Binding TypeArticle}" ItemTemplate="{StaticResource TypeArticleTemplate}" SelectedItemChanged="ArboChangeSelection"
                                          Height="470" Width="250" BorderBrush="Transparent" BorderThickness="0" >
                                    <TreeView.Resources>
                                        <Style TargetType="TreeViewItem">
                                            <Setter Property="Foreground" Value="#FF083A7F"/>
                                        </Style>
                                        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF5481BE" />
                                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FF5481BE" />
                                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="White" />
                                    </TreeView.Resources>
                                </TreeView>


    Merci beaucoup.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ajoute une colonne à la table TypeArticle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableTypeArticle.Columns.Add("IsSelected", typeof(bool));
    Dans le ItemContainerStyle, bind le IsSelected du TreeViewItem sur la colonne IsSelected de la table (cf. code XAML dans mon message d'hier après-midi)

    Et pour sélectionner un TreeViewItem, change simplement la valeur de la colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataRowView childItem = (DataRowView)itemTreeview.Items.GetItemAt(loop);
    childItem["IsSelected"] = true;

Discussions similaires

  1. Selection d'une valeur dans une autre table
    Par beurnoir dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h02
  2. Surbrillance de selection effectuee par soft dans un TDBRIG
    Par AODRENN dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/08/2005, 13h32
  3. [VB.NET] Problème liste Parent-Enfant dans DataGrid
    Par vonbier dans le forum ASP.NET
    Réponses: 7
    Dernier message: 27/01/2005, 08h53
  4. [VB6] sélection multiple de colonne dans excel grâce à VB
    Par biquet dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/08/2004, 12h44
  5. Enfant dans parent
    Par toctoc80 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/04/2004, 16h40

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