c# datagridview显示枚举值

本文关键字:枚举 显示 datagridview | 更新日期: 2023-09-27 18:01:27

我有一个用c#编写的winform应用程序。为了显示这个问题,我编写了以下代码片段:

class A
{
    public E e{get; set;}
}
enum E
{
    A=2,
    B=3
}
void Form1_Load(object sender, EventArgs e)
{
    A[] AA=new A[]
           {
               new A{e=E.A},
               new A{}
           };
    dataGridView1.DataSource=AA;
}    

我想让它在数据网格的第二行显示空白,但是它会生成一个异常"System。ArgumentException:值"0"不是enum"E"的有效值。我该怎么处理呢?基本上数据是从别人的程序返回的,我不能改变。

顺便说一句,我已经在propertyGrid中显示了单个值。效果很好。当枚举值为null时,它显示一个空白单元格,这正是我想要的。但是数据网格的工作方式不同。

c# datagridview显示枚举值

我猜你会看到那个恼人的对话框,它不断地用那个异常作为消息警告你。解决方法是通过订阅DataGridViewDataError事件并将e.ThrowException设置为false来覆盖默认行为。然而,由于吞下异常有点麻烦,您可能希望将其作用域限制为您试图吞下的异常。我是这样处理的。

private void DataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    var columnIndex = e.ColumnIndex;
    var valueType = dataGridView.Columns[columnIndex].ValueType;
    //HACK: Hides the infinitely-appearing error dialog for enum values which are not defined as fields in the enum.
    e.ThrowException = !typeof(Enum).IsAssignableFrom(valueType) || Enum.IsDefined(valueType, dataGridView[columnIndex, e.RowIndex].Value);
}

因此,如果单元格的ValueType不能分配给Enum,或者如果实际值在有问题的枚举中定义,则对话框将出现

由于没有在数组第二个元素的默认构造函数中为E提供任何值,因此该变量E被初始化为0,这是int类型的默认值。但是,0不在enum类型的集合中,因此抛出异常。

解决方案是为类a创建一个默认构造函数。

class A
{
    public A(){
        e = E.A; 
    }
    public E e{get; set;}
}