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 :

WPF affichage de données concaténées


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut WPF affichage de données concaténées
    Bonjour,

    Le problème est simple encore faut il connaitre le mécanisme à mettre en œuvre..

    J'ai un ID(numéro de machine) et d'autres données que j'affiche dans un tableau. Pour l'utilisateur, au lieu d'avoir un ID, il doit apparaitre un ID et un programme auquel il appartient...

    ainsi j'ai les classes :

    TaskProvider qui contient des propriété dont l'ID(numéro de machine) et TaskViewProvider,
    puis PrgHcProvider et PrgHcViewProvider (contient tous les programmes de tous les Hc),
    enfin PrgProvider et PrgViewProvider (contient tous les programmes)

    voici le code XamL :

    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
    <DataGrid.Columns>
    				<DataGridComboBoxColumn Header="Planning" SelectedValueBinding="{Binding Path=PLAN_ID}" ItemsSource="{Binding Source={StaticResource PlanningViewProvider},Path=Plannings}" DisplayMemberPath="PLN_NAME" SelectedValuePath="PLN_ID" CanUserReorder="True" />
     
    				<DataGridTemplateColumn Header="HC" Width="*" >
    					<DataGridTemplateColumn.CellTemplate>
    						<DataTemplate>                               
    								<TextBlock Width="48"  Height="22"  Text="{Binding HC_ID }"/>
    						</DataTemplate>
    					</DataGridTemplateColumn.CellTemplate>
    					<DataGridTemplateColumn.CellEditingTemplate>
    						<DataTemplate>
    							<TextBox Width="48"  Height="22"  Text="{Binding HC_ID}"/>
    						</DataTemplate>
    					</DataGridTemplateColumn.CellEditingTemplate >
    				</DataGridTemplateColumn>
    [...]
    Je bloque ...
    Merci d'avance !!

  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
    Points : 39 753
    Points
    39 753
    Par défaut
    J'ai pas tout compris, mais ce serait pas juste un MultiBinding qu'il te faut ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="{}{0} {1}">
                <Binding Path="Id" />
                <Binding Path="NomDuProgramme" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    oui! sauf que j'arrive pas à binder ma valeur

    Du coup je viens de faire ça :
    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
     
    <Page.Resources>
    		<ObjectDataProvider ObjectInstance="{StaticResource PrgHcViewProvider}" ObjectType="{x:Type static:PrgHcViewProvider}" x:Key="PrgNameFromHc" MethodName="PrgNameFromHc">
    			<ObjectDataProvider.MethodParameters>
    				<System:Int32>4</System:Int32>
    			</ObjectDataProvider.MethodParameters>
    		</ObjectDataProvider>
    </Page.Resources>
     
    						<DataTemplate>
    							<TextBlock>
    								<TextBlock.Text>
    									<MultiBinding StringFormat="{}{0} {1}">
    										<Binding Path="HC_ID" />
    										<Binding Source="{StaticResource PrgNameFromHc}" Path="MethodParameters[0]" BindsDirectlyToSource="true" UpdateSourceTrigger="PropertyChanged" />
    									</MultiBinding>
    								</TextBlock.Text>
    							</TextBlock>
    						</DataTemplate>
    j'ai comme erreur :

    La propriété Set 'System.Windows.Data.ObjectDataProvider.ObjectInstance' a levé une exception.
    Je pense que c'est pas un ObjectDataProvider l'Element que je dois appeler car ma classe est une ViewProvider mais du coup je sais pas quelle élément je dois appeler dans mon xamL pour instancier mon objet et faire appel à ma méthode "PrgNameFromHc" qui me retourne un string ...

    voici le code behind
    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
        class PrgHcViewProvider
        {
            private PrgHcProvider _PrgHcProvider = new PrgHcProvider();
            public ObservableCollection<PRG_HC> ProgHcs
            {
                get
                {
                    return _PrgHcProvider._PrgHcs;
                }
            }
            public string PrgNameFromHc(int i)
            {
                System.Windows.MessageBox.Show(_PrgHcProvider.PrgCollectionFromHc(i).ElementAt(5).PRG_NAME);
                return _PrgHcProvider.PrgCollectionFromHc(i).ElementAt(5).PRG_NAME;
            }
            public IEnumerable<T_ARBO_PRG> PrgNameFromHc()
            {
                return _PrgHcProvider.PrgCollectionFromHc();
            }
        }
    j'ai mis quelque élément en dur mais c'est pour simplifier car je bloque ...

  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 : 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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par lerieure Voir le message
    La propriété Set 'System.Windows.Data.ObjectDataProvider.ObjectInstance' a levé une exception.
    Quelle est la InnerException ?


    Sinon je comprends pas trop ce que tu fais... pourquoi tu bindes sur le paramètre de la méthode du ObjectDataProvider ? C'est pas le paramètre qui t'intéresse, si ? Plutôt le résultat ?

    Et où est définie la ressource PrgHcViewProvider à laquelle tu fais référence ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    System.InvalidOperationException
    ObjectDataProvider ne peut se voir assigner qu'un ObjectType ou un ObjectInstance, pas les deux.
    à System.Windows.Data.ObjectDataProvider.set_ObjectInstance(Object value)
    et bien mon paramètre doit etre un Hc_ID (numero de la machine) la je m'ai mis en dur (<System:Int32>4</System:Int32>) car je ne sais pas donner le Hc_ID en fonction des enregistrement de mon tableau...

    Après en effet c'est plutôt le résultat qui m'intéresse afin que l'utilisateur est l'id et le programme de la machine en fonction donc de la machine

    Le but étant donc d'avoir au lieu de 4 avoir 4 - MonProgramme Name
    si c'était l' id 2 alors afficher 2- MonProgramme Name2


    voici la déclaration des ressoources :
    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
    	<Page.Resources>
    		<ObjectDataProvider x:Key="FalList" />
    		<CollectionViewSource x:Key="TaskViewSource" d:DesignSource="{d:DesignInstance staticData:TASK, CreateList=True}" />
    		<CollectionViewSource x:Key="FalViewSource" d:DesignSource="{d:DesignInstance staticData:T_ARBO_FAL, CreateList=True}" />
     
    		<static:FalViewProvider x:Key="FalViewProvider" />
    		<static:StationViewProvider x:Key="StationViewProvider" />
    		<static:PlanningViewProvider x:Key="PlanningViewProvider" />
    		<static:PrgHcViewProvider x:Key="PrgHcViewProvider" />
     
    		<ObjectDataProvider ObjectInstance="{StaticResource PrgHcViewProvider}" ObjectType="{x:Type static:PrgHcViewProvider}" x:Key="PrgNameFromHc" MethodName="PrgNameFromHc">
    			<ObjectDataProvider.MethodParameters>
    				<System:Int32>4</System:Int32>
    			</ObjectDataProvider.MethodParameters>
    		</ObjectDataProvider>
     
    	</Page.Resources>

    la piece jointe est du XamL (fichier complet)

    Donc c'est bien du MultiBinding comme tu le dis mais le deuxieme binding doit etre le nom du programme en fonction de mon HC_ID et PrgNameFromHc renvoit le nom du programme en fonction du paramètre qui est le HC_ID normalement mais il est vrai que dans le XamL c'est en dur car je sais pas faire autrement...
    au lieu de :
    <System:Int32>4</System:Int32>

    il faudrait un truc du genre <System:Int32>HC_ID</System:Int32>
    Mais je sais pas comment faire ...


    Merci pour tes interventions ca m'aide 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 : 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
    Points : 39 753
    Points
    39 753
    Par défaut
    Ah ok, je commence à comprendre...

    Tu ne peux pas passer un paramètre à un ObjectDataProvider via un binding. Utilise plutôt un converter, ou alors (plus simple), expose sur ton objet une propriété qui renvoie directement la valeur qui t'intéresse, déjà formattée. C'est beaucoup plus simple comme ça, tu n'auras même plus besoin du multibinding ni du ObjectDataProvider

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    équivalent du MainWindow

    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
    public partial class Page2 : Page
        {
            private AnanceDataContext _DbAnance;
            private CollectionViewSource TaskViewSource = new CollectionViewSource();
            private FalViewProvider FalViewProvider = new FalViewProvider();
            private StationProvider StationProvider = new StationProvider();
            private PlanningProvider PlanningViewProvider = new PlanningProvider();
     
     
            public Page2()
            {
                InitializeComponent();
                _DbAnance = new AnanceDataContext();
     
                var TaskList = (from Fal in _DbAnance.T_ARBO_FAL select Fal).ToList();
                TaskViewSource.Source = from Task in _DbAnance.TASK orderby Task.HC_ID, Task.DATE_START ascending select Task;
                DataGridTask.DataContext = TaskViewSource;
            }
     
            private void Button1_Click(object sender, RoutedEventArgs e)
            {
                _DbAnance.SubmitChanges();
            }
    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
        class PrgHcViewProvider
        {
            private PrgHcProvider _PrgHcProvider = new PrgHcProvider();
            public ObservableCollection<PRG_HC> ProgHcs
            {
                get
                {
                    return _PrgHcProvider._PrgHcs;
                }
            }
            public string PrgNameFromHc(int i)
            {
                System.Windows.MessageBox.Show(_PrgHcProvider.PrgCollectionFromHc(i).ElementAt(5).PRG_NAME);
                return _PrgHcProvider.PrgCollectionFromHc(i).ElementAt(5).PRG_NAME;
            }
            public IEnumerable<T_ARBO_PRG> PrgNameFromHc()
            {
                return _PrgHcProvider.PrgCollectionFromHc();
            }
        }

    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
       class PrgHcProvider
        {
            private AnanceDataContext _DbAnance;
            public ObservableCollection<PRG_HC> _PrgHcs;
     
            public PrgHcProvider() 
            {
                _DbAnance = new AnanceDataContext();
                _PrgHcs = new ObservableCollection<PRG_HC>();
                var ProgHcList = from LeProgHc in _DbAnance.PRG_HC select LeProgHc;
     
                foreach (PRG_HC MonProgHc in ProgHcList)
                {
                    _PrgHcs.Add(MonProgHc);
                }
            }
     
     
        }

    Dans quelle classe je dois exposer une propriété ? qu est ce que ca veut dire exposer ?

    j'ai l'impression d'être bloqué, je vois pas ou est ce que je peux ajouter une propiété qui sera exploitable par la suite ... Peux tu m'en dire plus ?

    Merci

  8. #8
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Arf, c'est plus compliqué que je croyais en fait... L'objet qui te fournit le HC_ID pourrait pas fournir aussi le PrgName ?
    A mon avis tu te compliques beaucoup la vie en essayant d'implémenter dans le XAML une logique métier qui n'a rien à faire là. Le XAML, c'est pour la présentation et uniquement pour ça...


    Citation Envoyé par lerieure Voir le message
    qu est ce que ca veut dire exposer ?
    créer une propriété publique pour rendre la valeur accessible de l'extérieur de la classe

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    ben l'objet qui fournit l'HC_ID vient de la classe TASK qui est un mapping de la table en base de données par une génération automatique ...

    Solution 1
    donc ça voudrait dire qu'il faudrait ajouter une propriété à la classe TASK ...

    Mais comme elle a été créé automatiquement est ce que le lien va se garder pour enregistrer, inserer, mettre a jour même si je rajoute une propiété virtuelle ?

    Par ailleurs est que si je modifie ma base de données et que je synchronise mes classes à la base, cette propriété virtuelle va pas être écraser ?


    Solution 2

    Enfin, le mieux serait il pas d'hériter la classe Task de base générer automatiquement en CustomTask et d'ajouter une propriété virtuelle ?


    Le truc c'est que j'ai jamais vu faire ca sur le net alors bon...

    J'espère que tu pourrais m'aiguiller car j'ai aucune idée de la meilleure solution...

    Pourtant je trouve que ce sont des problème basique "génération d'une propriété virtuelle pour mieux expliciter la données à l'utilisateur" et tout le monde doit utiliser la génération automatique pour le gain de temps donc je sais pas comment ils font ...


    Solution 3
    Après mon datacontext est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TaskViewSource.Source = from Task in _DbAnance.TASK orderby Task.HC_ID, Task.DATE_START ascending select Task;
                DataGridTask.DataContext = TaskViewSource;
    Est ce que ta solution serait d'aller chercher le programme name avec LINQ et créer des variables concaténer des attribues de ma table du genre
    join [...] select [...]maview=Task.HC_ID+" "+Programme.programmeName [...]

    Mais question par rapport à cette solution : est ce que le submitchange marcherait ?


    J'attends avec impatience tes conseils merci d'avance !

  10. #10
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par lerieure Voir le message
    Mais comme elle a été créé automatiquement est ce que le lien va se garder pour enregistrer, inserer, mettre a jour même si je rajoute une propiété virtuelle ?
    Tu peux quand même la customiser même si elle est générée automatiquement, grace au modifieur partial. Tu crées un autre fichier, où tu déclares ta classe comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace TonNamespace
    {
     
        public partial class TASK
        {
            // ce que tu veux...
        }
    }
    Par contre je n'ai pas compris pourquoi tu parlais de propriété virtuelle...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    propriété virtuelle dans le sens où elle n'a pas vraiment lieu d'être ou d’existence propre et elle n'est que la concaténation d'autres données...

  12. #12
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par lerieure Voir le message
    propriété virtuelle dans le sens où elle n'a pas vraiment lieu d'être ou d’existence propre et elle n'est que la concaténation d'autres données...
    ah ok
    mais fais gaffe aux termes que tu utilises, parce que "virtuelle" ça a un sens précis en programmation objet

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

Discussions similaires

  1. Affichage de données à concaténer
    Par mialy.rakot dans le forum Ext JS / Sencha
    Réponses: 10
    Dernier message: 12/11/2010, 14h40
  2. TDBCtrlGrid - Affichage des données
    Par audreyb dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2004, 13h10
  3. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07
  4. Affichage de données (histograme, graphe etc.)
    Par sunshine33 dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 13/01/2004, 14h16
  5. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19

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