我正在使用实体框架(EF),并且我可以从上下文中获取BindingList
(使用DbExtensions.ToBindingList方法),并且我有一个DataGridView
的表单。
目标是在DataGridView
上显示EF表的内容,因此我在表单的构造函数中有以下代码来设置DataGridView
的{来自EF的DataSource
BindingSource
以及BindingSource
DataSource
BindingList
:
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
(抛出异常的方法)究竟是什么检查,或者为什么{{1不会被设置。
我尝试提供了解问题所需的所有代码,但如果您需要更多,请告诉我。我还检查了几个关于S / O的相关问题 - 没有一个答案有帮助。
编辑:看来我可以从除构造函数之外的任何其他方法调用Sort。这可能是一个线程问题。
答案 0 :(得分:1)
看起来行categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();
必须调用另一个在调用Sort时尚未完成的线程,因此SortDataBoundDataGridView_PerformCheck
检查的一些属性尚未更新爱好。
因此,解决方案是在该线程完成后调用该方法。这是一个很好的地方,因此它仍然可以实现在用户看到数据成员之前对数据成员进行排序的影响,它是通过覆盖表单的OnLoad方法并在那里调用Sort。