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 :

Parcours des éléments d'un ListView


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut Parcours des éléments d'un ListView
    Salut les gens !

    La fenêtre WPF qui me pose actuellement problème contient deux choses :
    - une combobox me permettant de sélectionner un IZI_OBJETS
    - une listview avec gridview affichant une liste d'utilisateur.
    Chaque ligne contient nom prénom etc, et surtout commence par une CheckBox qui indique si l'utilisateur de la ligne et l'objet de la combobox sont en relation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <DataTemplate x:Key="CellTemplate_Relation">
       <CheckBox Click="chkb_relation_Click"/>
    </DataTemplate>
     
    //...
     
    <ListView Name="lv_utilisateurs" ItemsSource="{Binding}">
                                <ListView.View>
                                    <GridView x:Name="gv_utilisateurs" AllowsColumnReorder="true">
                                        <GridViewColumn x:Name="gvc_rel_utilisateur" Header="En relation" CellTemplate="{StaticResource CellTemplate_Relation}"/>
                                        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=ID_UTILISATEUR}"/>
    //...
    Créer / Supprimer la relation en cochant / décochant la checkbox, pas de problème.

    Le soucis, c'est la mise à jour des cochés / décochés quand je change d'objet. Dans le SelectionChanged j'aimerai parcourir les lignes, et pour chacune comparer l'utilisateur "logique" avec ma base et si c'est en relation avec l'objet, cocher la checkbox de la ligne "graphique"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void cb_objets_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                // Liste des utilisateurs déjà liés à cet objet
                var deja_lies =
                    (...).ToList();
     
                foreach (IZI_UTILISATEURS ligne in lv_utilisateurs.Items as IZI_UTILISATEURS)
                {
                    if (deja_lies.Contains(ligne))
                    {
                        // Cocher la checkbox
                    }
                }
    Comme montré ci-dessus, parcourir les éléments logiques, ça je peux. Mais accéder à la checkbox pour la cocher ... Dans mes événement "OnClick" je cast Sender et ca roule, mais la ce n'est pas le même contexte

    Par quelle fonction / propriété puis je passer ?

  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 : 43
    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
    Je ne vois pas exactement comment faire, mais voilà au moins une piste : avec la propriété ItemContainerGenerator de la ListView, tu peux accéder à l'UI de chaque élément de la liste. A partir de là, tu dois pouvoir bidouiller pour récupérer la CheckBox...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Effectivement, je peux ainsi obtenir le ListViewItem via ContainerFromIndex par exemple.

    Maintenant, yapuka accéder à la checkbox. C'pas gagné non plus on dirait

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    J'ai peut être ce qu'il me faut ici : Comment : rechercher des éléments générés par DataTemplate

    Mais je n'ai pas la fonction FindVisualChild. En fait, elle n'existe pas dixit l'explorateur d'objet VS2008 qui a priori regarde dans tout ce qui est disponible niveau references ...

    J'aime la façon dont commence cette semaine


    PS : Non en fait, la fonction est juste plus bas, à copier coller

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par Nalfeim Voir le message
    J'ai peut être ce qu'il me faut ici : Comment : rechercher des éléments générés par DataTemplate

    Mais je n'ai pas la fonction FindVisualChild. En fait, elle n'existe pas dixit l'explorateur d'objet VS2008 qui a priori regarde dans tout ce qui est disponible niveau references ...

    J'aime la façon dont commence cette semaine


    PS : Non en fait, la fonction est juste plus bas, à copier coller
    La méthode FindVisualChild est écrite juste après, sur la même pas....

    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
     
    private childItem FindVisualChild<childItem>(DependencyObject obj)
        where childItem : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child != null && child is childItem)
                return (childItem)child;
            else
            {
                childItem childOfChild = FindVisualChild<childItem>(child);
                if (childOfChild != null)
                    return childOfChild;
            }
        }
        return null;
    }

  6. #6
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    bonjour,
    ça ressemble un peu à un post que j'ai fait il n'y a pas si longtemps :
    c'était pour cocher des cases dans des ListBoxItems, mais ça ne change pas grand chose.

    http://www.developpez.net/forums/sho...96#post3426896

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Ouep, ton code ressemble effectivement à l'exemple MSDN que j'ai fini par trouver

    In fine, j'ai fais à peut prêt pareil. Modulo un peu de réécriture goret parce qu'il est hors de question que le fonctionnaire qui reprendra mon proj' ne se casse pas un minimum le cul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                for (int i = 0; i < lv_utilisateurs.Items.Count; i++)
                {
                    // Inspiré de <a href="http://msdn.microsoft.com/fr-fr/library/system.windows.frameworktemplate.findname.aspx" target="_blank">http://msdn.microsoft.com/fr-fr/libr....findname.aspx</a>
                    ListViewItem lvi = lv_utilisateurs.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem;
                    ContentPresenter cp = lvi.FindVisualChild<ContentPresenter>();
                    CheckBox cb = cp.ContentTemplate.FindName("chkb_relation", cp) as CheckBox;
     
                    // CheckBox cochée si l'utilisateur correspondant fait parti des relations de l'objet
                    cb.IsChecked = relations_objet.Contains(cb.DataContext as IZI_UTILISATEURS);                     
                }

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

Discussions similaires

  1. [WD15] Parcours des éléments du tableau
    Par sphynxounet dans le forum WinDev
    Réponses: 3
    Dernier message: 23/06/2010, 08h55
  2. Trouver l'index des éléments d'une ListView
    Par Sophie VB dans le forum ASP.NET
    Réponses: 1
    Dernier message: 28/10/2009, 14h51
  3. parcours des éléments d'un document
    Par r83 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/09/2009, 17h19
  4. Modification de l'ordre d'affichage des éléments d'une listview
    Par Onizuka-3 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 24/02/2009, 11h47
  5. Soulignement des éléments d'une ListView
    Par xanatos dans le forum VB.NET
    Réponses: 4
    Dernier message: 28/02/2008, 23h26

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