昨天花了很多时间搜索这个我不得不放弃。
我有一个链接到数据表的 DataGridView。其中一列是枚举,我希望它显示为 Combobox 列。
我发现这个链接从 DataGridView 中的枚举中创建下拉列表选项,它的答案是使用以下...
DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.Name = "My Enum Column";
col.DataSource = Enum.GetValues(typeof(MyEnum));
col.ValueType = typeof(MyEnum);
dataGridView1.Columns.Add(col);
我已经尝试过了,但是当用户创建新记录时,从下拉列表中选择一个选项(显示正确的选项)然后移出他们收到消息“DataGridViewComboBoxCel 值无效”的字段。我在搜索中找到了一些解决方案,讨论如何捕获此错误,然后什么也不做(从而隐藏错误),但我想解决它而不仅仅是隐藏它。如果用户确定是他们收到的消息,则再重复两次。
我还看到了遍历枚举中的值并为每个值创建一个包含 int 和字符串的数据表的解决方案,然后将数据表用作组合中的数据源。过去在使用后端 MSSQL 数据库时,我使用数据表作为组合框的源。
另一种变体是循环并直接写入组合中,例如......
foreach (MyEnum bar in MyEnum.GetValues(typeof(MyEnum)))
{
string barName = MyEnum.GetName(typeof(MyEnum), bar);
MyComboColumn.Items.Add(barName);
}
例如在此链接中的问题中。如何将一些枚举值添加到组合框
我的问题:可以使用 Enum.GetValues(typeof(MyEnum)); 方法?数据表方法似乎冗长。然后循环使用 MyComboColumn.Items.Add(barName); 也有点冗长,会导致枚举的字符串版本被记录在数据表中,而不是整数(我宁愿它是整数)。
我找不到将网格链接到数据表的 Enum.GetValues(typeof(MyEnum)) 方法的示例。当我搜索时,我只是遇到了其他方法。
我认为问题很可能出在基础表列的数据类型上。我试过把它作为一个整数,作为一个字符串,我试过不定义它。我想不出还有什么可以尝试这种类型的。
这是我的简化代码。(DVG 是我在表单上的 DataGridView)。
enum EngineType
{
None = 0,
EngineType1 = 1,
EngineType2 = 2
}
public partial class MyClass : Form
{
DataTable DtTbl;
public MyClass()
{
InitializeComponent();
CreateTableStructure();
}
private void CreateTableStructure()
{
DGV.AutoGenerateColumns = false;
DGV.DataSource = DtTbl;
DtTbl = new DataTable();
DtTbl.Columns.Add(new DataColumn("Name", System.Type.GetType("System.String")));
DataGridViewTextBoxColumn NameCol = new DataGridViewTextBoxColumn();
NameCol.DataPropertyName = "Name";
NameCol.HeaderText = "Name";
DGV.Columns.Add(NameCol);
DtTbl.Columns.Add(new DataColumn("Engine", System.Type.GetType("System.Int32")));
DataGridViewComboBoxColumn EngineCol = new DataGridViewComboBoxColumn();
EngineCol.DataPropertyName = "Engine";
EngineCol.HeaderText = "Engine";
//EngineCol.DataSource = EngineType.GetValues(typeof(EngineType));
foreach (EngineType engine in EngineType.GetValues(typeof(EngineType)))
{
string engineName = EngineType.GetName(typeof(EngineType), engine);
EngineCol.Items.Add(engineName);
}
DGV.Columns.Add(EngineCol);
}
}