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";