ComboBox列上的DataGridView默认错误

时间:2013-12-03 18:54:37

标签: c# visual-studio-2012 datagridview enums .net-4.5

我的.NET 4.5 WinForms应用程序中有一个DataGridView,有两列。一列是常规文本框列,另一列是DataGridViewComboBoxColumn,它是一个下拉列表。我正在尝试将列绑定到我的BindingList对象的Filter,我希望枚举FilterType中的所有内容都显示在下拉列表中。这是我的对象和枚举的代码:

public class Filter
{
  public string keyword { get; set; }
  public FilterType type { get; set; }
}

public enum FilterType : int   //the strings should appear in the dropdown
{
  SESSION = 1,
  ORDER = 2,
  SHIPMENT = 3
}

我已在VS 2012设计器中手动创建了列,我将ColumnTypeHeaderTextDataPropertyName更改为keywordtype。<登记/> 使用我发现here的答案,我已将这两行代码添加到表单加载事件中:

colFilterType.DataSource = Enum.GetValues(typeof(FilterType));
colFilterType.ValueType = typeof(FilterType);

当我运行代码时,我最初看到一个空行。每当我点击该行时,无论点击哪一列,都会出现弹出错误。

  

System.ArgumentException:DataGridViewComboBoxCell值无效。 ...请处理DataError事件。

我可以忽略它并在Keyword列中键入我想要的任何文本,并使用枚举的第一个值神奇地填充下拉列表。但是,如果我甚至将鼠标悬停在下拉列表上,则会再次弹出错误(请参阅屏幕截图)。我不确定导致错误的原因并且不知道在哪里设置断点。我也不知道我是否通过在设计器中创建DataGridView的一部分并在代码中修改它们来创建问题。设计师不允许我按照我在代码中的方式设置DataSource。它还包含我在代码中没有看到的字段ValueMember

enter image description here

虽然不理想,但我不介意捕捉错误并且不做任何事情,因为下拉似乎填充自己(假设所有数据保持不变)。

1 个答案:

答案 0 :(得分:2)

在运行时添加列时,您的代码可以正常工作。示例代码:

 DataGridViewComboBoxColumn colFilterType = new DataGridViewComboBoxColumn();
 colFilterType.HeaderText = "Name you want";
 colFilterType.DataSource = Enum.GetValues(typeof(FilterType));
 colFilterType.ValueType = typeof(FilterType);
 dataGridView1.Columns.Add(colFilterType);

在运行时更改单元格/列的类型时,通常会引发与您报告的错误相同的错误,因为每次DataGridView以任何方式受到影响时都会触发大量事件:他们期望旧类型并找到具有新类型的元素(例如,期望int并找到string)。