【问题标题】:DataGridView Default Error on ComboBox Column组合框列上的 DataGridView 默认错误
【发布时间】:2013-12-03 18:54:36
【问题描述】:

我的 .NET 4.5 WinForms 应用程序中有一个包含两列的 DataGridView。一列是常规文本框列,另一列是DataGridViewComboBoxColumn,它是一个下拉列表。我正在尝试将列绑定到我的Filter 对象的BindingList,并且我希望枚举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

虽然不理想,但我不介意捕捉错误并且不采取任何措施,因为下拉菜单似乎会自行填充(并假设所有数据都保持不变)。

【问题讨论】:

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


    【解决方案1】:

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

     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)。

    【讨论】:

    • 这行得通,感谢您的提示!但是,每当添加新行时,新的下拉列表都是空白的。然后我需要点击下拉菜单一次给它焦点,再一次填充它,再一次最终打开它。这是DataGridView 的另一个怪癖吗?或者你知道我能不能解决这个问题?
    • @valsidalv 欢迎您。新行是空白的,因为它默认不选择任何项目;只需通过强制所选项目成为您想要的项目来改变它。
    • 我实际上发现了一个问题。必须将字段colFilterType.DataPropertyName 设置为"type",以便DataGridView 中的更改在Filters 的绑定列表中正确更新,否则它们都显示为0。添加此绑定会导致错误。
    • @valsidalv 你应该明白,我猜不出你的代码中有什么。如果您创建一个没有列的新 DataGridView,并执行我的答案中的代码,它会正常工作而无需执行任何其他操作。您的错误(您抱怨的错误)是通过更改给定列的类型引起的(您在设计视图中设置了不同的类型)。您可以找到的任何其他问题都会由您的代码引发。如果你不分享它,我将无法提供帮助。虽然你不应该说它会触发错误,因为它不是真的。
    • @valsidalv 另外,以后如果您不介意,请尽量避免标记入/出问题,我个人不太喜欢这个问题。标记告诉哪个答案解决了问题;所以请等到您的问题得到解决或根据需要询问(我知道您的代码已经运行良好,但很好......)。我邀请您查看我的个人资料,以了解我对这个问题和类似问题的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多