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 :

C# et WPF : comment afficher des données dans une DataGrid (to bind or not to bind ?!?)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut C# et WPF : comment afficher des données dans une DataGrid (to bind or not to bind ?!?)
    Bonjour,

    j'essaye d'afficher des données dans une DataGrid ... et je n'y arrive pas !

    J'ai trouvé quelques tutos sur le net, mais leurs exemples ne compilent pas ou ne fonctionnent pas

    Admettons que j'aie une collection d'objets, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Personne> listPers = new List<Personne>();
    (à noter que dans mon code la collection n'est pas vide, c'est juste un exemple que j'utilise ici)

    et dans mon XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="MajEcrans.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MajEcrans" Height="450" Width="450" 
        xmlns:WTK="http://schemas.microsoft.com/wpf/2008/toolkit">
        <Grid>
     
                 <WTK:DataGrid  ItemsSource="{Binding Path=???}"
     
                 </WTK:DataGrid>
        </Grid>
    </Window>
    Je ne saisis pas comment faire le fameux binding dont tous les tutos parlent.
    Votre aide serait la bienvenue

    Pour info j'utilise VS 2008 express et DOTNET 3.5 avec le wpf toolkit qui fournit la DataGrid non incluse de base.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Il faut préalablement ajouter au DataContext de la DataGrid ou un de ses contrôles/conteneurs parents (pour toi la Grid ou la Window) l'objet que tu souhaites binder.
    C'est le dernier DataContext défini qui sera pris en compte (c'est à dire que si tous les DataContext -Window, Grid, DataGrid- sont définis, c'est celui de la DataGrid qui sera pris en compte dans le binding au niveau de la propriété ItemsSource).

    Soit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = listPers;
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="MajEcrans.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MajEcrans" Height="450" Width="450" 
        xmlns:WTK="http://schemas.microsoft.com/wpf/2008/toolkit">
        <Grid>
     
                 <WTK:DataGrid  ItemsSource="{Binding }" >
     
                 </WTK:DataGrid>
        </Grid>
    </Window>

    Dans cet exemple pas besoin de définir de Path. C'est directement la liste qu'on associe.

    Si tu avais ajouté à ton DataContext un objet Entreprise qui lui contient une propriété "listPers", alors on aurait eu :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = monEntreprise;
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="MajEcrans.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MajEcrans" Height="450" Width="450" 
        xmlns:WTK="http://schemas.microsoft.com/wpf/2008/toolkit">
        <Grid>
     
                 <WTK:DataGrid  ItemsSource="{Binding listPers}" >
     
                 </WTK:DataGrid>
        </Grid>
    </Window>

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Attention, il faut que la propriété sur laquelle tu veuilles te binder possède un getter et setter

  4. #4
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Super ça marche !

    Pour aller plus avant, comment définir plusieurs DataContext (par exemple un pour chaque onglet d'un <TabControl> ?

    En tout cas merci pour le coup de main, maintenant je peux avancer, c'était vraiment le seul truc qui me bloquait pour finir mon appli.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par jmnicolas
    Pour aller plus avant, comment définir plusieurs DataContext (par exemple un pour chaque onglet d'un <TabControl> ?
    Un TabControl a donc plusieurs TabItem (onglets), une solution serait de définir le DataContext de chaque TabItem.

  6. #6
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Merci.
    Je marque ce sujet comme résolu
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  7. #7
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Bon je remonte ce sujet car j'ai vraiment du mal avec WPF ! Je n'arrive pas à définir un datacontext pour chacun de mes onglets. Voici un aperçu de mon XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TabControl>
                    <TabItem Name="Bandef" Header="Bandeau défilant" Width="150">
     
     
                        <WTK:DataGrid  ItemsSource="{Binding}" Margin="5" AutoGenerateColumns="False" >
    et dans mon code j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bandef.DataContext = listBandeaux;
    listBandeaux est une List<> d'objets.

    A noter que mon code fonctionne si j'attribue le datacontext à la window ou si je n'attribue pas de datacontext du tout

    Voici le message d'erreur :

    L'exception System.Windows.Markup.XamlParseException n'a pas été gérée
    Message="Impossible de créer une instance de 'Window1' définie dans l'assembly 'MajEcrans, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Une exception a été levée par la cible d'un appel. Erreur dans le fichier de balisage 'Window1.xaml' ligne 1 position 9."
    Source="PresentationFramework"
    LineNumber=1
    LinePosition=9
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Lorsque tu as le message d'erreur, tu dois pouvoir accéder au détail de l'exception et déployer les InnerException (jusqu'à ce que InnerException soit null). Le dernier message InnerException non null t'indique normalement de manière plus précise le problème.

    Est-ce que tu peux nous donner cette InnerException ?

  9. #9
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    La référence d'objet n'est pas définie à une instance d'un objet.
    Mais quel abruti !!!
    (je parle de moi bien entendu !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Window1()
    		{			
    			List<Bandeau> LaListe = new List<Bandeau>();
    			LaListe.Add(new Bandeau());
    			LaListe.Add(new Bandeau());
     
     
    			Bandef.DataContext = LaListe;
     
    			InitializeComponent();
     
     
    		}
    Vu que je crée mon DataContext avant la méthode InitializeComponent(), forcément ça ne pouvait pas marcher !

    Bon ben désolé pour le dérangement, je vais de ce pas me flageller avec des orties fraichement coupées
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

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

Discussions similaires

  1. [Dojo] Afficher des données dans une datagrid lié au toolkit dojo workers
    Par bella125 dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 14/02/2014, 10h45
  2. Réponses: 17
    Dernier message: 22/09/2006, 17h34
  3. Afficher des données dans un datagrid à partir d'une base de données MySQL
    Par General_Garrisson dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/07/2006, 15h14
  4. Comment afficher des JPEG dans une application Delphi ?
    Par Bouguennec dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2005, 21h18
  5. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24

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