Afficher une collection dans un datagridview [Résolu]

thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 10 avril 2007 à 15:18 - Dernière réponse : thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention
- 19 avril 2007 à 17:45
Bonjour,


Mon problème est le suivant. Je cherche à afficher dans un datagridview les différents éléments d'une collection d'objets "LigneFactureClass". J'utilise donc le bindingsource auquel j'affecte ma collection.
Lorsque j'exécute mon appli, mon datagridview est bien chargé avec les éléments de ma collection.
Mon problème est que les objets de ma collection possèdent un attribut d'un type non primitif (type ProduitClass que j'ai créé)


Mon datagridview affiche bien les valeurs des attributs simples (n° facture, n° ligne) mais pour mon attribut de type ProduitClasse, il affiche "ProduitClass".
Comment faire pour afficher la valeur de l'attribut Produit_cod de mon attribut de type ProduitClasse


public class ProduitClass
    {
        private System.String _Produit_cod = "";
        private System.String _Produit_ref = "";
        private System.String _Produit_des = "";
        ...
        public String Produit_cod {...}
        public String Produit_ref {...}
        public String Produit_des {...}


     }


J'ai une classe LigneFacture :
public class LigneFactureClass
{
       private System.UInt32 _DetailId = 0;
       private System.UInt32 _FactureId = 0;
       private Produit _Produit = null;


       public System.UInt32 _DetailId {...}
       public System.UInt32 _FactureId {...}
       public ProduitClass Produit {...}      
...
}




J'espère avoir été assez clair, merci


Si quelqu'un à des exemples concrets sur le bindingsource (sans passer par ADO.Net, Dataset ...), je suis preneur


Merci à tous


 
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 19 avril 2007 à 17:45
3
Merci
Bonjour

J'ai trouvé une solution, je ne sais pas si c'est la plus simple (je pense pas mais ça marche).
J'utilise les PropertyDescriptor. J'ai vu ça dans les WebCast de Mistu sur le DataBinding Avancé.

En gros, j'ai créer un MonObjetBindingSource propre à mon Objet (bien mon bindinsource dérive de BindingSource) dans lequel j'ai ajouté de nouvelles propriétés

Je vous mets un exemple :

Ma classe CustomClientBindingSource

class CustomClientBindingSource : BindingSource
{

public delegate object PropertyEventHandler(object sender, object row, string propertyName, Type propertyType);
public event PropertyEventHandler PropertyEval;

protected internal object OnPropertyEval(object row, string propertyName, Type propertyType)
{
if (!DesignMode)
{
if (PropertyEval != null)
{
return PropertyEval(this, row, propertyName, propertyType);
}
}
return null;
}

public override System.ComponentModel.PropertyDescriptorCollection GetItemProperties(System.ComponentModel.PropertyDescriptor[] listAccessors)
{
PropertyDescriptorCollection sourceProps;
if (this.DataSource == null)
sourceProps = PropertyDescriptorCollection.Empty;

object obj1 = ListBindingHelper.GetList(this.DataSource);
if ((obj1 is ITypedList) && !string.IsNullOrEmpty(this.DataMember))
{
sourceProps = ListBindingHelper.GetListItemProperties(obj1, this.DataMember, listAccessors);
}
else
sourceProps = ListBindingHelper.GetListItemProperties(obj1, listAccessors);

PropertyDescriptor[] props = new PropertyDescriptor[sourceProps.Count + 2];
for (int i = 0; i < sourceProps.Count; i++)
{
props[i] = sourceProps[i];
}
CustomTypePropertyDescriptor cust = new CustomTypePropertyDescriptor(this,GetType(), "Fake", typeof(string));
props[sourceProps.Count] = cust;
CustomTypePropertyDescriptor cust1 = new CustomTypePropertyDescriptor(this,GetType(), "Adresse", typeof(string));
props[sourceProps.Count + 1] = cust1;

return new PropertyDescriptorCollection(props);
}

private class CustomTypePropertyDescriptor : PropertyDescriptor
{
public CustomTypePropertyDescriptor(CustomClientBindingSource source, Type componentType, string propertyName, Type propertyType)
: base(propertyName, null)
{
this.propertyName = propertyName;
this.propertyType = propertyType;
this.componentType = componentType;
this.source = source;
}

private string propertyName;
private Type propertyType;
private Type componentType;
private CustomClientBindingSource source;

public override object GetValue(object component)
{
return source.OnPropertyEval(component, propertyName, propertyType);
}

protected override Attribute[] AttributeArray
{
get
{
return null;
}
set
{
}
}
public override Type ComponentType
{
get
{
return componentType;
}
}
public override bool IsReadOnly
{
get
{
return true;
}
}
public override Type PropertyType
{
get
{
return propertyType;
}
}
public override bool CanResetValue(object component)
{
return false;
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
}
}

Ma form ou j'ai placé un datagridview que j'ai binder avec mon ClientBindingSource :

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Adresse adr = new Adresse(1, "Rue des marguerites");
ArrayList list = new ArrayList();
list.Add(new Client("Toto", "Seb", adr));
list.Add(new Client("Titi", "Franck", adr));
customClientBindingSource1.DataSource = list;
}

private object customClientBindingSource1_PropertyEval(object sender, object row, string propertyName, Type propertyType)
{
switch (propertyName)
{
case "Fake":
return ((Client)row).Nom + " " + ((Client)row).Prenom;
case "Adresse":
return ((Client)row).AdresseClient.NumeroAdresse + " " + ((Client)row).AdresseClient.Rue;
}
return null;
}
}

Dans l'évenement PropertyEval, j'alimente les nouvelles propriétés.

Voilà<!-- / message -->

Merci thorgal1612 3

codes-sources a aidé 81 internautes ce mois-ci

Commenter la réponse de thorgal1612
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 10 avril 2007 à 16:44
0
Merci
dans ta classe ProduitClass, il faut surcharger la méthode ToString()

Tu peux aussi créer un TypeConverter pour ta classe.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.