c#datagridview显示枚举值

c#datagridview显示枚举值,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个用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{}

我有一个用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;
}    
我希望它在datagrid的第二行显示为空,但它会生成一个异常“System.ArgumentException:值“0”不是枚举“E”的有效值”。 我该怎么处理呢?基本上,数据是从别人的程序返回的,我不能更改


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

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

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

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

    public E e{get; set;}
}

我猜你会看到一个恼人的对话框,它不断地以消息的形式警告你这个异常。解决方法是通过订阅
DataGridView
DataError
事件并将
e.throweexception
设置为
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
或实际值是在相关Enum中定义的,则会出现对话框。

看起来第二个
A
没有E值,且Enum没有默认值。非常好的类名“A”、Enum“E”和数组“A[]AA”))它使阅读和理解更容易)你能更改类或枚举吗?@MD.Unicorn不,我不能更改类或枚举定义。它们作为图书馆由他人提供。