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
Alors, ça fonctionne bien mais uniquement pour les champs à afficher
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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
Partager