如何在DataGridViewComboBox中显示枚举类型成员?

Dr *_* TJ 11 c# enums datagridview

为了ReadAccess在这个DatagridViewComboBox中显示枚举成员,我还需要做些什么?

ReadDataGridViewComboBoxColumn.Items.Clear();
ReadDataGridViewComboBoxColumn.Items.AddRange(ReadAccess.None, ReadAccess.Allowed);
ReadDataGridViewComboBoxColumn.ValueType = typeof(ReadAccess);
Run Code Online (Sandbox Code Playgroud)

这是关于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;
Run Code Online (Sandbox Code Playgroud)

最后,在之后InitializeComponent();,我正在设置DataGridView的DataSource:

this.rolesDataGridView.DataSource = this.RoleTablePermissions;  // a bindingsource list
Run Code Online (Sandbox Code Playgroud)

Bra*_*ith 21

这是我多次遇到的问题.在DataGridViewComboBoxColumn不知道如何调和枚举的字符串表示和它的积分值之间的差异.即使您设置ValueType为枚举的类型,DataGridView也会尝试将单元格的值设置为基础int值 - 这就是FormatException在数据绑定期间将引发的原因.

我发现克服这个问题的唯一方法(没有子类化单元格类型)是将DataGridViewComboBoxColumn数据源绑定到一个数据源,该数据源将字符串值与整数值分开.您可以为此目的使用匿名类型:

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

这样,DataGridView知道如何将单元格值与其格式化值相关联.


bu5*_*4nn 8

添加到答案Bradly Smith提供:使用此代码可以轻松获取所有Enum值(而不是单独命名每个):

    ReadDataGridViewComboBoxColumn.DataSource =
        new List<ReadAccess>((ReadAccess[]) Enum.GetValues(typeof(ReadAccess)))
        .Select(value => new { Display=value.ToString(), Value=(int)value })
        .ToList();
Run Code Online (Sandbox Code Playgroud)