我的.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设计器中手动创建了列,我将ColumnType
,HeaderText
和DataPropertyName
更改为keyword
和type
。<登记/>
使用我发现here的答案,我已将这两行代码添加到表单加载事件中:
colFilterType.DataSource = Enum.GetValues(typeof(FilterType));
colFilterType.ValueType = typeof(FilterType);
当我运行代码时,我最初看到一个空行。每当我点击该行时,无论点击哪一列,都会出现弹出错误。
System.ArgumentException:DataGridViewComboBoxCell值无效。 ...请处理DataError事件。
我可以忽略它并在Keyword
列中键入我想要的任何文本,并使用枚举的第一个值神奇地填充下拉列表。但是,如果我甚至将鼠标悬停在下拉列表上,则会再次弹出错误(请参阅屏幕截图)。我不确定导致错误的原因并且不知道在哪里设置断点。我也不知道我是否通过在设计器中创建DataGridView的一部分并在代码中修改它们来创建问题。设计师不允许我按照我在代码中的方式设置DataSource
。它还包含我在代码中没有看到的字段ValueMember
。
虽然不理想,但我不介意捕捉错误并且不做任何事情,因为下拉似乎填充自己(假设所有数据保持不变)。
答案 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
)。