1

我有一个用 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'不是枚举'E'的有效值。”。我该如何处理?基本上数据是从其他程序返回的,我无法更改。

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

4

2 回答 2

0

我猜你会得到那个烦人的对话框,它会不断地以消息的形式警告你该异常。解决方法是通过订阅DataGridView'DataError事件并设置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因此,如果相关单元格的 不可分配给 anEnum或者如果在相关枚举中定义了实际值,则会出现对话框。

于 2021-01-23T23:02:52.423 回答
-1

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

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

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

    public E e{get; set;}
}
于 2013-02-28T08:48:27.763 回答