Datagridview et sous-classes
Bonjour,
j'aimerais pouvoir afficher dans une datagridview les sous classes, je m'explique.
J'ai une classe(qui est la source de ma datagridview) qui contient elle même plusieurs classe dont j'aimerais afficher les propriétés.
voici ci dessous le code ajoutant les colonnes à afficher avec les données sur ma datagridview
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
private DataGridViewColumn[] GetColumnToAdd(Type baseType)
{
DataGridViewColumn[] result = null;
// Recuperer le type de la liste générique
Type genType = dgv.DataSource.GetType().GetProperty("Item").PropertyType;
// Créer la liste Temporaire pour contenir les propriétés à afficher
List<PropertyDescriptor> propToDisplay = new List<PropertyDescriptor>();
// Balayage des propriétés du type
foreach (PropertyDescriptor propDesc1 in TypeDescriptor.GetProperties(baseType))
{
// Si la propriété possède l'attribut attendu, on l'ajoute
if (propDesc1.Attributes[typeof(DataGridViewColumnAttribute)] != null)
{
propToDisplay.Add(propDesc1);
}
foreach (PropertyDescriptor propDesc2 in TypeDescriptor.GetProperties(propDesc1.PropertyType))
{
if (propDesc2.Attributes[typeof(DataGridViewColumnAttribute)] != null)
{
propToDisplay.Add(propDesc2);
}
foreach (PropertyDescriptor propDesc3 in TypeDescriptor.GetProperties(propDesc2.PropertyType))
{
if (propDesc3.Attributes[typeof(DataGridViewColumnAttribute)] != null)
{
propToDisplay.Add(propDesc3);
}
}
}
}
// si il y a des propriétés à afficher
if (propToDisplay.Count > 0)
{
// tri des champs en fonction de l'index donné
propToDisplay.Sort(
delegate(PropertyDescriptor p1, PropertyDescriptor p2)
{
return
(p1.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute).Index
.CompareTo(
(p2.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute).Index);
});
}
// définir la taille du tableau des colonnes à afficher
result = new DataGridViewColumn[propToDisplay.Count];
//
int counter = 0;
//
foreach (PropertyDescriptor propDesc in propToDisplay)
{
DataGridViewColumn dgvc;
DataGridViewColumnAttribute dgvcAtt = (propDesc.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute);
switch (dgvcAtt.ColumnType)
{
case DataGridViewColumnType.TextBox:
dgvc = new DataGridViewTextBoxColumn();
break;
case DataGridViewColumnType.CheckBox:
dgvc = new DataGridViewCheckBoxColumn();
break;
default:
dgvc = new DataGridViewTextBoxColumn();
break;
}
dgvc.HeaderText = dgvcAtt.HeaderText != string.Empty ? dgvcAtt.HeaderText : propDesc.DisplayName;
dgvc.ValueType = propDesc.PropertyType.GetType();
dgvc.DataPropertyName = propDesc.Name;
result[counter++] = dgvc;
}
return result;
} |
Alors, ça fonctionne bien mais uniquement pour les champs à afficher
pour les données, seules les propriétés de premier niveau s'affiche.
alors comment affecter les sous propriétés...
j'espère m'etre bien fait compris :)
merci de votre aide