【问题标题】:c# datagridview show enum valuec# datagridview 显示枚举值
【发布时间】:2021-01-24 07:02:52
【问题描述】:

我有一个用 C# 编写的 winform 应用程序。为了说明问题,我写了如下代码sn-p。

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 中显示了一个值。它运作良好。当枚举值为空时,它显示一个空白单元格,这正是我想要的。但是数据网格的工作方式不同。

【问题讨论】:

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

标签: c# winforms datagridview


【解决方案1】:

我猜你会得到那个烦人的对话框,它会不断地以消息的形式警告你该异常。解决方法是通过订阅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,或者如果在相关枚举中定义了实际值,则会出现该对话框。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2020-04-08
      • 1970-01-01
      • 2016-03-05
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多