Comment afficher les membres de type Enum dans un DataGridViewComboBox?

Que dois-je faire d’autre pour afficher les membres enum ReadAccess dans cette DatagridViewComboBox?

 ReadDataGridViewComboBoxColumn.Items.Clear(); ReadDataGridViewComboBoxColumn.Items.AddRange(ReadAccess.None, ReadAccess.Allowed); ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); 

Voici les codes générés par le concepteur à propos de DataGridView:

 this.rolesDataGridView.AutoGenerateColumns = false; this.rolesDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.TableNameDataGridViewTextBoxColumn, this.ReadDataGridViewComboBoxColumn, this.WriteDataGridViewComboBoxColumn, this.ReadCodeDataGridViewComboBoxColumn, this.ProcessDataGridViewCheckBoxColumn, this.AdministrateDataGridViewCheckBoxColumn}); this.rolesDataGridView.DataSource = this.bsTablePermissions; 

et enfin, après InitializeComponent(); , je suis en train de paramétrer la source de données de DataGridView:

 this.rolesDataGridView.DataSource = this.RoleTablePermissions; // a bindingsource list 

C’est un problème que j’ai rencontré à plusieurs resockets. DataGridViewComboBoxColumn ne sait pas comment réconcilier la différence entre la représentation sous forme de chaîne de l’énum et sa valeur intégrale. Même si vous définissez ValueType sur le type de l’énum, DataGridView tentera de définir la valeur de la cellule sur la valeur int sous-jacente. C’est pourquoi une FormatException sera FormatException lors de la liaison de données.

Le seul moyen que j’ai trouvé pour résoudre ce problème (à moins de sous-classer le type de cellule) est de lier DataGridViewComboBoxColumn à une source de données qui sépare les valeurs de chaîne des valeurs entières. Vous pouvez utiliser un type anonyme à cette fin:

 ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); ReadDataGridViewComboBoxColumn.ValueMember = "Value"; ReadDataGridViewComboBoxColumn.DisplayMember = "Display"; ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] { ReadAccess.None, ReadAccess.Allowed } .Select(value => new { Display=value.ToSsortingng(), Value=(int)value }) .ToList(); 

De cette façon, le DataGridView sait comment associer la valeur de la cellule à sa valeur formatée.

Ajoutant à la réponse fournie par Bradly Smith: Ce code permet d’obtenir facilement toutes les valeurs Enum (au lieu de les nommer individuellement):

  ReadDataGridViewComboBoxColumn.DataSource = new List((ReadAccess[]) Enum.GetValues(typeof(ReadAccess))) .Select(value => new { Display=value.ToSsortingng(), Value=(int)value }) .ToList(); 

Vous ne devriez pas convertir la valeur enum en int. Utilisez ce code si vous avez une erreur du type “valeur invalide”:

 ReadDataGridViewComboBoxColumn.DataSource = new ReadAccess[] { ReadAccess.None, ReadAccess.Allowed } .Select(value => new { Display=value.ToSsortingng(), Value=value }) .ToList(); 

Une amélioration à la réponse acceptée: Il n’est pas nécessaire de saisir manuellement les membres d’énum en tant que tableau. À la place, vous pouvez utiliser System.Enum.GetValues(typeof(ReadAccess)) . De plus, au lieu d’une liste de types anonymes, vous pouvez utiliser une liste du dictionnaire (le dictionnaire n’est pas accepté comme source de données):

 ReadDataGridViewComboBoxColumn.DataSource= System.Enum.GetValues(typeof(ReadAccess)) .Cast.ToDictionary((e) => e.ToSsortingng(), (e) => e).ToList; 

ou directement une liste KeyValuePair :

 ReadDataGridViewComboBoxColumn.DataSource = System.Enum.GetValues(typeof(ReadAccess)) .Cast.Select((value) => new KeyValuePair(value.ToSsortingng(), (value))); 

Encore nécessaire (mais DisplayMember est maintenant ” Key “):

  ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess); ReadDataGridViewComboBoxColumn.ValueMember = "Value"; ReadDataGridViewComboBoxColumn.DisplayMember = "Key";