2

我正在使用实体框架 (EF),并且BindingList可以从上下文中获取一个(使用DbExtensions.ToBindingList方法),并且我有一个带有DataGridView.

目的是在 上显示 EF 表的内容,因此我在表单的构造函数中DataGridView有以下代码将's设置为 a和 that 's到from EF:DataGridViewDataSourceBindingSourceBindingSourceDataSourceBindingList

categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();
categoryDataGrid.Sort(categoryDataGrid.Columns["categorySortIdColumn"], ListSortDirection.Ascending);

在此之前,在 Form 生成的代码中,存在以下几行:

categoryDataGrid.DataSource = categoryBindSrc;
categorySortIdColumn.DataPropertyName = "SortId";

这段代码在表单的构造函数中,但是当我运行它时,我得到以下异常(我截断了堆栈跟踪):

System.InvalidOperationException was unhandled
HResult=-2146233079
Message=DataGridView control must be bound to an IBindingList object to be sorted.
Source=System.Windows.Forms
StackTrace:
    at System.Windows.Forms.DataGridView.SortDataBoundDataGridView_PerformCheck(DataGridViewColumn dataGridViewColumn)
    at System.Windows.Forms.DataGridView.SortInternal(IComparer comparer, DataGridViewColumn dataGridViewColumn, ListSortDirection direction)
    at System.Windows.Forms.DataGridView.Sort(DataGridViewColumn dataGridViewColumn, ListSortDirection direction)

据我了解,BindingList确实实施IBindingList了,所以这不应该是问题。Sort方法说DataGridView必须是数据绑定的(它是)并且设置了按列排序的属性DataPropertyName(它是)这导致列的IsDataBound属性返回 true(调试时它在监视窗口中显示为 false)

似乎问题在于IsDataBound没有得到更新,但我不知道SortDataBoundDataGridView_PerformCheck确切检查什么(引发异常的方法),或者为什么IsDataBound不设置。

我试图提供您理解问题所需的所有代码,但如果您需要更多代码,请告诉我。我还检查了几个关于 S/O 的相关问题——没有一个答案有帮助。

编辑:看来我可以从构造函数以外的任何其他方法调用 Sort 。这可能是线程问题。

4

1 回答 1

1

看起来该行categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();必须在调用 Sort 时调用另一个尚未完成的线程,因此SortDataBoundDataGridView_PerformCheck尚未更新检查的几个属性。

因此,解决方案是在该线程完成后调用该方法。一个很好的放置它的地方是通过覆盖表单的 OnLoad 方法并在那里调用 Sort 来实现在用户看到它们之前对数据成员进行排序的效果。

于 2013-01-17T14:23:01.887 回答