5

从嵌入在数据网格视图中的数据网格视图组合框(下拉菜单)控件中选择新值时遇到异常。组合框由 BindingSource 填充,其中填充了我的类的实例。我可以正确显示菜单中的选项,然后选择一个,但是将焦点更改为新控件(我猜是提交更改)会导致出现异常:从 System.String 到 myclass 的无效转换。堆栈跟踪(如果我使用该词正确)显示源是

System.Windows.Forms.DataGridView.PushFormattedValue 级联到 System.Convert.DefaultToType

下面是更明确的解释(对不起,它太长了,但我想让它可重现):

我有一个名为 Occupant 的空类,没有属性(当 Occupant 也有一个字符串 Name 属性时存在问题,所以不是那样)。我有一个名为 OccupantSource 的 BindingSource,它的 DataSource 指向 Occupant。

我还有一个名为 Car 的类,有一个名为 Driver 的 Occupant 属性。

在我的 Form_Load() 中,我调用了 OccupantSource.AddNew() 两次,并调用了 CarSource.AddNew() 一次。

我有一个 DataGridView 控件,它的 DataSource 是 CarSource(由 Cars 组成的 BindingSource)。DGV 有一列,显示 CarSource 中汽车的 Driver 属性。它是一个 DataGridViewComboBoxColumn,DataPropertyName 设置为驱动程序。

所以我想要的是在 Datagridview 中显示汽车行,其中一列是一个组合框,我可以下拉并从现有的 Occupant 实例中选择一个驱动程序。但我得到了例外。

这是我误会了吗?不能使用类的实例来填充 DataGridViewComboBox 吗?

4

1 回答 1

6

我遇到了完全相同的问题,并且摸不着头脑,使用我的 google-fu 数小时试图解决它。这个链接帮助我终于给了我一个很好的解释。 http://www.pcreview.co.uk/forums/datagridview-combobox-column-error-listing-objects-t2344961.html

我修复它的方法是更改​​ DisplayMember。我在返回“this”的类上引用了“Self”——我将它用于 DisplayMember 和 ValueMember,认为它只是来自 DisplayMember 的 ToString() 属性。

阅读您的解释,您可能根本没有设置 DisplayMember 和 ValueMember?如果是这种情况,请尝试正确设置它们(并且不要对显示成员使用“this”的引用!)它可能会修复它。

于 2011-11-02T12:52:42.277 回答