c# - 如何在 DataGridViewComboBox 中显示 Enum 类型的成员?

标签 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 的数据源:

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

最佳答案

这是我遇到过很多次的问题。 DataGridViewComboBoxColumn 不知道如何协调枚举的字符串表示及其整数值之间的差异。即使您将 ValueType 设置为枚举类型,DataGridView 也会尝试将单元格的值设置为基础 int 值 - 这是为什么在数据绑定(bind)期间会引发 FormatException

我发现解决此问题(除了对单元格类型进行子类化)的唯一方法是将 DataGridViewComboBoxColumn 绑定(bind)到将字符串值与整数值分开的数据源。您可以为此目的使用匿名类型:

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 就知道如何将单元格值与其格式化值相关联。

关于c# - 如何在 DataGridViewComboBox 中显示 Enum 类型的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120838/

相关文章:

ios - Swift 3.0 中的结构体枚举

c# - 网络上是否有单一资源列出所有 ASP.Net 安全问题(XSS 等)和预防措施?

c# 遍历数据表,更改数据

c# - 如何更改 Windows 窗体中 DataGridViewColumn 的标题?

vb.net - 通知用户正在填充 DataGridView

java - Jgrasp Java 26错误: class, interface, or enum expected

c# - 如何使用javascript获取 session 值

c# - 如何在数据绑定(bind)转发器中创建条件内容

c# - 使用列表作为 DataGridView 的数据源

swift - 可以在 Swift 中将枚举类型名称作为参数传递吗?