我有一个用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的工作方式不同。
答案 0 :(得分: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
不可分配给 Enum
或实际值已在相关枚举中定义,则会出现对话框。
答案 1 :(得分:-1)
由于在数组的第二个元素的默认构造函数中没有为E提供任何值,因此该变量E初始化为0,这是int类型的默认值。但是,0不在枚举类型的集合中,因此抛出异常。
解决方案是为A类创建默认构造函数。
class A
{
public A(){
e = E.A;
}
public E e{get; set;}
}