UserControl - DataGridView - Modifier les colonnes
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
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
| [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; }
} |
La DataSource du UsrDataGrid est lié à une BindingSource typé, la DataGridView génère automatiquement les colonnes associées.
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.
Code:
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;
}
} |
Arrivé là le designer affiche correctement mes colonnes, je les édites puis c'est le drame:
- 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