Bonjour,
Je me prend la tête depuis quelques jours sur un problème de UserControl et de DataGridView.
J'ai un UserControl que nous nommerons UsrDataGrid qui contient entre autre une DataGridView.
Les propriétés DataSource et Columns de la DataGridView sont exposé comme propriétés du UserControl.
Extrait de UsrDataGrid
La DataSource du UsrDataGrid est lié à une BindingSource typé, la DataGridView génère automatiquement les colonnes associées.
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 [Category("DataGridView")] [AttributeProvider(typeof(IListSource))] [DefaultValue(null)] [RefreshProperties(RefreshProperties.Repaint)] public object DataSource { get { return DataGridViewType.DataSource; } set { DataGridViewType.DataSource = value; } } [Category("DataGridView")] [DefaultValue("")] [Editor("System.Windows.Forms.Design.DataMemberListEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] public string DataMember { get { return DataGridViewType.DataMember; } set { DataGridViewType.DataMember = value; } } [Category("DataGridView")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor(typeof(UsrDataGridColumnEditor), typeof(UITypeEditor))] [MergableProperty(false)] public DataGridViewColumnCollection Columns { get { return DataGridViewType.Columns; } }
Maintenant je souhaite personnaliser mes colonnes, et la je commence à perdre mes cheveux...
Lorsque je cliquais sur les "..." de la propriété "Columns" de ma UsrDataGrid j'ai obtenu quelques erreur du designer quand à l'interprétation des data.
J'ai donc mis en place un UITypeEditor dédié, concrètement je dis au designer : lorsque tu veux afficher les Columns d'un UsrDataGrid, affiche les Columns du DataGridView nommé "DataGridViewType" dans UsrDataGrid.
Arrivé là le designer affiche correctement mes colonnes, je les édites puis c'est le drame:
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 public class UsrDataGridColumnEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { DataGridView myDataGridView = ((UsrDataGrid)context.Instance).DataGridViewType; myDataGridView.Site = ((Control)context.Instance).Site; var columnsProperty = TypeDescriptor.GetProperties(myDataGridView)["Columns"]; var tdc = new TypeDescriptionContext(myDataGridView, columnsProperty); var editor = (UITypeEditor)columnsProperty.GetEditor(typeof(UITypeEditor)); var result = editor.EditValue(tdc, provider, value); myDataGridView.Site = null; return result; } }
- des nouvelles colonnes sont créées afin de prendre en compte mes modifications
- le nom des anciennes colonnes n'est pas repris
- la UsrDataGrid référence les nouvelles colonnes mais pas les anciennes, j'obtiens donc un fichier *.designer.cs remplie de DataGridViewColumn inutilisé
J'ai essayé de renommer les DataGridViewColumn en modifiant leur propriété "Name" depuis UsrDataGridColumnEditor mais rien.
J'ai également penser faire une CustomControl héritant d'une DataGridView mais il faudrait pouvoir insérer un panel sur la partie haute et réduire la zone du dessin de la DataGridView et ça non plus, ça ne marche pas...
Une idée ou piste de reflexion?
Merci
Partager