为了在此 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/