DataGridView Sort抛出异常:控件必须绑定到IBindingList

本文关键字:绑定 IBindingList 控件 Sort 抛出异常 DataGridView | 更新日期: 2023-09-27 17:53:36

我使用实体框架(EF),并有一个BindingList,我可以从上下文中获得(使用DbExtensions)。toindinglist方法),并且我有一个具有DataGridView的表单。

目标是在DataGridView上显示EF表的内容,因此我在表单的构造函数中使用以下代码DataGridViewDataSource设置为BindingSource,并将BindingSourceDataSource设置为BindingList:
categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();
categoryDataGrid.Sort(categoryDataGrid.Columns["categorySortIdColumn"], ListSortDirection.Ascending);

在此之前,在表单生成的代码中,存在这些行:

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的相关问题——没有一个答案有帮助。

EDIT:看来我可以从任何其他方法调用排序,除了构造函数。这可能是线程问题。

DataGridView Sort抛出异常:控件必须绑定到IBindingList

看起来categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();这行必须调用另一个线程,当Sort被调用时还没有完成,所以SortDataBoundDataGridView_PerformCheck检查的几个属性还没有更新。

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