DataGridView Sort抛出异常:控件必须绑定到IBindingList
本文关键字:绑定 IBindingList 控件 Sort 抛出异常 DataGridView | 更新日期: 2023-09-27 17:53:36
我使用实体框架(EF),并有一个BindingList
,我可以从上下文中获得(使用DbExtensions)。toindinglist方法),并且我有一个具有DataGridView
的表单。
DataGridView
上显示EF表的内容,因此我在表单的构造函数中使用以下代码将DataGridView
的DataSource
设置为BindingSource
,并将BindingSource
的DataSource
设置为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:看来我可以从任何其他方法调用排序,除了构造函数。这可能是线程问题。
看起来categoryBindSrc.DataSource = _context.Categories.Local.ToBindingList();
这行必须调用另一个线程,当Sort被调用时还没有完成,所以SortDataBoundDataGridView_PerformCheck
检查的几个属性还没有更新。