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

时间:2010-11-08 02:20:19

标签: c# datagridview enums

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

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

这里是关于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;

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

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

4 个答案:

答案 0 :(得分: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(); 绑定到一个数据源,该数据源将字符串值与整数值分开。您可以为此目的使用匿名类型:

DataGridView

这样,{{1}}知道如何将单元格值与其格式化值相关联。

答案 1 :(得分:8)

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

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

答案 2 :(得分:2)

您不应将枚举值转换为int。如果您遇到类似“无效值”的错误,请使用此代码:

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

答案 3 :(得分:0)

接受答案的改进: 无需手动将枚举成员键入为数组。相反,您可以使用System.Enum.GetValues(typeof(ReadAccess))此外,您可以使用词典中的列表 (词典不被接受为数据源)代替匿名类型列表:

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

或直接 KeyValuePair列表

ReadDataGridViewComboBoxColumn.DataSource = System.Enum.GetValues(typeof(ReadAccess))
  .Cast<Enum>.Select((value) => new KeyValuePair<string, enum>(value.ToString(), (value)));

仍然有必要(但DisplayMember现在是&#34; &#34;):

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