IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

UserControl - DataGridView - Modifier les colonnes


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut 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 : 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; }
    }
    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 : 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;
        }
    }
    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

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Exposer une prop de type DataGridViewColumnCollection me parait inapproprie ,si tu veux mettre à jour par le Designer VS cette collection car elle est "readonly" et elle géré en interne par le DGV.
    Il vaut mieux dans ton custom DGV exposer une prop de type Array de StyledColuMN qui est le seul type de base géré par le designer VS.

    A chaque fois que cet Array est modifié sur le designer ,il est recopie dans la prop de base DataGridViewColumnCollection

    code code behind .cs exemple d'un dgv custom avec une "StyledColumn" ou colonne stylée:
    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
     
    namespace ControlLibCustomDGV
    {
       // la colonne  "stylée" et  sérialisable
        [Serializable]
        public class StyledColumn : DataGridViewColumn
        {
            public StyledColumn()
            {
                this.CellTemplate = new DataGridViewTextBoxCell();
            }
        }
    }
    // le  custom  dgv
     
     public partial class SimpleDGV : DataGridView
        {
            public SimpleDGV()
            {
                InitializeComponent();
     
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
            }
     
            public new StyledColumn[] Columns 
            {
                get
                {
                   List< StyledColumn> item_list = new List<StyledColumn>();
                    for (int i = 0 ;i<base.Columns.Count ;i++)
                    {
                        item_list.Add((StyledColumn)base.Columns[i]);
                    }
                    return item_list.ToArray();
                }
                set 
                { 
                    base.Columns.Clear(); // vidange la colection et on la remplit à nouveau à chaque modif sur le Designer. 
                    foreach (StyledColumn  item in value)
                    {
                        base.Columns.AddRange(item);
                    }
     
                }
     
            }
        }
     
      //le  usercontrol
      public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
     
            public StyledColumn[] Columns
            {
                get { return this.customDgv1.Columns; }
                set { this.customDgv1.Columns = value; }
            }
     
            public object DataSource
            {
                get { return this.customDgv1.DataSource ; }
                set { this.customDgv1.DataSource=value ; }
            }
     
        }
    code behind .cs du user form:
    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
     
    namespace WinTest2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
                this.userControl11.DataSource = getdt() ;
            }
            //private void FillDataTable()
            //{
            //    DataTable dt = this.dataSet1.Tables[0];
     
            //    DataRow dr = dt.NewRow();
            //    for (int i = 1; i < 3; i++)
            //    {
            //        dr[0] = i;
            //        dr[1] = "item" + i.ToString();
            //        dt.Rows.Add(dr);
            //        dr = dt.NewRow();
            //    }
     
            //}
            private DataTable getdt()
            {
                DataTable dt = new DataTable("table1");
                dt.Columns.AddRange(new DataColumn[] { 
                    new DataColumn("id",typeof(int)), 
                    new DataColumn("name",typeof(string))});
                DataRow dr = dt.NewRow();
                for (int i = 1; i < 3; i++)
                {
                    dr[0] = i;
                    dr[1] = "item" + i.ToString();
                    dt.Rows.Add(dr);
                    dr = dt.NewRow();
                }
                return dt;
            }
        }
    }
    Je te signaler également que lorsque tu utilises le binding les colonnes ajoutés au moment du design sont rajoutés "en plus ou en sus" des colonnes bindées ,comportement par défaut du designer VS.
    Pour surmonter ce handicap, il existe une issue de secours: affecter à la prop DataBoundItem au moment du Design :
    - le nom approprie de la Colonne bindée (cas du DataSet type)
    Cela évitera de generer des colonnes en "sus".
    bon code...

Discussions similaires

  1. Datagridview, trier les colonnes
    Par ricil78 dans le forum VB.NET
    Réponses: 6
    Dernier message: 25/02/2013, 11h58
  2. Modifier les colonnes d'un DBGrid
    Par vg-matrix dans le forum Composants VCL
    Réponses: 3
    Dernier message: 08/12/2010, 11h20
  3. datagridview et les colonnes checkcolumnBox
    Par mounim_taoufik dans le forum Windows Forms
    Réponses: 0
    Dernier message: 02/10/2009, 14h10
  4. Modifier les colonnes dans un TreeViewer
    Par Viteazul dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 05/08/2009, 17h11
  5. Réponses: 0
    Dernier message: 02/11/2007, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo