lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 juin 2010
-
6 août 2007 à 13:38
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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....
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...)...
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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.
stephbrol
Messages postés6Date d'inscriptionmardi 2 novembre 2004StatutMembreDernière intervention17 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 :
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
stephbrol
Messages postés6Date d'inscriptionmardi 2 novembre 2004StatutMembreDernière intervention17 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 :
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.
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...
stephbrol
Messages postés6Date d'inscriptionmardi 2 novembre 2004StatutMembreDernière intervention17 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.
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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.
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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);
}
}
lbensch
Messages postés55Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention10 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.