begin process at 2010 02 09 23:48:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Autre

 > 

Afficher une collection dans un datagridview


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Afficher une collection dans un datagridview

mardi 10 avril 2007 à 15:18:53 | Afficher une collection dans un datagridview

thorgal1612

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

 

mardi 10 avril 2007 à 16:44:15 | Re : Afficher une collection dans un datagridview

sebmafate

Membre Club Administrateur CodeS-SourceS
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]
jeudi 19 avril 2007 à 17:45:43 | Re : Afficher une collection dans un datagridview

thorgal1612

Réponse acceptée !
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à


Cette discussion est classée dans : public, system, private, produit, collection


Répondre à ce message

Sujets en rapport avec ce message

C# - Erreur NullReferenceException [ par skyline86 ] Bonjour, 'ai un message NullReferenceExceptionsur la ligne     Program.monFormulaire.lb_log.BeginInvoke(new GPRSListener.Principale.affichageLog( Probleme avec une collection Dictionary [ par megamario ] Bonsoir, Décidément je vais pas m'en sortir, avec c'est collection. Après pas mal de difficulté avec une Hashtable avec certaine de résolu une Dictio Problème de portée de variables en C# [ par Chaboow ] Bonjour,Je suis actuellement en stage sur un projet C# objet. Je découvre le monde de l'objet et je bloque sur un problème de portée de variables ...V Problème lors de l'ajout de données [ par juninho2lyon ] Bonjourje suis en train de créer une application en C# utilisant une base de données Access.Or quand je clique sur le bouton "ajouter", j'ai l'erreur Probleme OleDbDataReader [ par bibibiba ] Bonjour,je suis novice en C# et j'ai une classe BaseAccess qui doit permettre de lire les données d'un utilisateur contenues dans une base,pour ce fai timer dans un usercontrol [ par johnnous ] bonjour j'ai un soucis je souhaite faire un bouton clignotant donc j'ai ajouter la propriete Twinkling qui lorsqu'elle passe a true m'active mon timer Problème lecture du son après capture audio [ par buen37 ] Bonjour,mon problème est le suivant : j'ai un bout de code (dont certaines parties proviennent d'internet) que j'ai bidouillé pour capturer du son via s'en sortir avec un FileStream [ par zoot06 ] Bonjour tout le monde, Voila je pensais bien faire avec ma fonction FileStream, mais quelque chose gache tout ce qui fait qui ne fonctionne pas.Voici


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales