Classes imbriquées en Databindings

lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010 - 6 août 2007 à 13:38
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010 - 20 août 2007 à 10:18
Bonjour, voici mon problème :

Contexte :
J'ai une application 3-tiers, dans ma couche IHM, je souhaiterais afficher une liste d'ObjetA, ObjetA étant un classe de ma couche METIER, dans cet ObjetA, j'ai une autre classe que nous appellerons ObjetB.
J'utilise un objet Grid dans mon IHM et je déclare un tableau de ObjetA que je rempli et assign au Datasource de ma Grid, automatiquement, le programme me créé les colonnes correctement, a l'exéption de la colonne ObjetB.

Question :
Comment dois-je faire pour avoir dans ma Grid les colonnes contenant
ObjetA.Prop1 | ObjetA.Prop2 | ObjetA.ObjetB.Prop1 | ObjetA.ObjetB.Prop2

J'ai cherché en vain et ne trouves rien, si vous pouviez m'aider....

Merci

14 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 août 2007 à 23:24
salut,

peut être peux-tu exposer les propriétés de ObjetB dans ObjetA ? sinon en créant les colonnes toi même et en indiquant "ObjetB.Prop2" dans le DataPropertyName (je n'ai jamais essayé mais je ne pense pas que ca marche...)...

ShareVB
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
14 août 2007 à 09:04
Salut,

J'ai essayé de déclarer 'ObjetB.Prop2' et cela ne fonctionne pas. Remonter les champs a afficher, j'y ai pensé mais cela me gène car je devrais changer l'ObjetA et j'aimerais éviter.
Donc la question reste encore ouverte.
0
stephbrol Messages postés 6 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 17 août 2007
16 août 2007 à 11:44
Tu peux utiliser un BindingSource comme DataSource d'un autre BindingSource.
Par exemple un objet User qui contient une collection d'objets Phone :

private BindingSource userBindingSource, phonesBindingSource;
...
this.userBindingSource = new BindingSource(this.components);
this.phonesBindingSource = new BindingSource(this.components);
...
this.phonesBindingSource.DataMember = "Phones";
this.phonesBindingSource.DataSource = this.userBindingSource;

ou encore une liaison sur un champ particulier d'un objet contenu dans un autre.
Par exemple le champ Street de l'objet Address contenu dans l'objet User :

this.streetTB.DataBindings.Add(new Binding("Text", this.userBindingSource, "Address.Street", true));

J'espère que cela t'apportera un début de solution.
Steph.
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
16 août 2007 à 11:49
J'ai l'impression que tes exemples sont très orientés SGBD et non Classe, mais je vais essayer de transposer cela, juste un point que je n'ai pas compris dans ton exemple des rues, "Adress.Street" renvoit sur un champ ou sur une table ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
16 août 2007 à 11:50
En plus je viens de me rendre compte qu'il manque un bout de code dans ton exemple, comment initialise tu "this.streetTB" ?
0
stephbrol Messages postés 6 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 17 août 2007
16 août 2007 à 13:02
C'est un TextBox, son initialisation n'est pas importante dans ce cas, et c'est pourquoi je ne l'ai pas indiqué.

Le code est totalement indépendant de tout ce qui est SGBD, car User, Address et Phone sont des classes du modèle. Le modèle ne sait pas quel est le système de persistance qui se trouve derrière car il s'adresse à des interfaces (Pattern DAO).

La vue utilise des instances des classes du modèle, et quand une instance subit une modification la vue peut immédiatement refléter ces modifications sans code supplémentaire, grâce à la liaison de donnée qui est faite ici :

this.streetTB.DataBindings.Add(new Binding("Text", this.userBindingSource, "Address.Street", true));

Donc si la rue est modifiée pour l'instance de User qui est affichée dans la vue (dans mon cas par la lecture de la carte d'identité électronique) le TextBox qui correspond est mios à jour.
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
16 août 2007 à 19:05
salut,

pour que le databinding fonctionne bien dans le sens : objet -> controle, il faut surement implémenter l'interface INotifyPropertyChanged pour que la bindingsource ou le binding se mette à jour et mette à jour le controle...

ShareVB
0
stephbrol Messages postés 6 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 17 août 2007
17 août 2007 à 09:29
Tu peux utiliser INotifyPropertyChanged si tu veux pouvoir passer un délégué défini dans ton IHM, et qui sera invoqué lors de l'évènement dans ton modèle, mais ce n'est pas nécessaire si tu désires simplement que la propriété Text de ta TextBox soit modifiée quand ton objet lié est modifié. A ce moment là c'est ton DataBinding qui se charge des adaptations nécessaires.
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
17 août 2007 à 09:47
Alors, je sais pas si cela va changer beaucoup de chose, mais en fait, moi, c'est pas dans un TextBox mais dans une Grid que je mets mes données, donc, je ne vois pas comment modifier le Databinding, il me propose que la classe ObjetA et je ne peux pas accéder aux propriétés de la classe ObjetB.
0
stephbrol Messages postés 6 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 17 août 2007
17 août 2007 à 12:32
Dans ta classe A, tu as un accesseur vers la classe B contenue ?
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
17 août 2007 à 13:41
Si je comprends bien la question, je dirais non. En fait, j'ai comme cela :

public class ObjectB
{
   private ClassDB_B FClass;
   public int Prop1 {get{return FClass.Prop1;}set{FClass.Prop1=value;}}
   public bool Prop2 {get{return FClass.Prop2;}set{FClass.Prop2=value;}}
   public string Prop3 {get{return FClass.Prop3;}set{FClass.Prop3=value;}}
   public ObjectB(string pFilter)
   {
      FClass = ClassDB.Find(pFilter);
   }
}

public class ObjectA
{
   private FClassDB_A FClass;
   private ObjectB FObject;
   public int Prop1 {get{return FClass.Prop1;}set{FClass.Prop1=value;}}
   public ObjectB Object {get{return FObject;}set{FObject=value;}}
   public ObjectA(string pFilter)
   {
      FClass = ObjectA.Find(pFilter);
      if (FClass != null)
         FObject = ObjectB.Find(FClass.IDObjectB);
   }
}
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
17 août 2007 à 13:43
Pour compléter :
ClassDB_A & ClassDB_B sont des classes dites "Données"
ObjectA & ObjectB sont les classes dites "Métiers" elles fusionnent ou filtre les données des classes "Données" de plus, le choix de masquer les ID est une contrainte de projet.
0
stephbrol Messages postés 6 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 17 août 2007
17 août 2007 à 20:54
public ObjectB Object {get{return FObject;}set{FObject=value;}}

C'est un accesseur vers une instance de la classe ObjectB contenu dans l'instance de ObjectA.

Donc sur une instance de ObjectA nommée objA, tu peux faire ceci : objA.Object.Prop1 qui te retournera l'entier contenu dans l'instance de ObjectB.

C'est en tout cas ce que ton binding effectuera pour toi.
0
lbensch Messages postés 55 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 10 juin 2010
20 août 2007 à 10:18
Oui mais comment déclarer le Binding justement. Aujourd'hui tout ce que j'ai fais c'est associer le Datasource de ma grille comme ceci :

Object A[] Montableau = ObjectA.Chercher();
Montableau = ObjectA.Chercher();
Magrille.DataSource = wResultat;
Magrille.Columns[0].FieldName = "Prop1";
Magrille.Columns[1].FieldName = "Prop2";
Magrille.Columns[2].FieldName = "ObjectB.Prop1";

Et la colonne 3 n'affiche rien en fait.
0
Rejoignez-nous