2013-01-16 88 views
2

我正在使用實體框架(EF),並有一個BindingList我可以從上下文(使用DbExtensions.ToBindingList方法),並且我有一個形式與DataGridViewDataGridView排序拋出異常:控件必須綁定到IBindingList

目的是在DataGridView顯示EF表中的內容,所以我在窗體的構造以下代碼設置DataGridViewDataSourceBindingSourceBindingSourceDataSourceBindingList從EF:

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的相關問題 - 沒有一個答案有幫助。

編輯:它看起來我可以調用排序只是從任何其他方法罰款除了構造函數。這可能是一個線程問題。

+1

嘗試將datagridview數據源直接設置爲IBindingList。 – 2013-01-16 19:18:42

+0

工作。謝謝!雖然我正在使用'BindingSource'與'BindingNavigator'進行通信,但是我會利用它來看看我能否解決問題。 – mjohnsonengr

+0

編輯指出排序在窗體的構造函數中調用,但可以從其他地方調用。 – mjohnsonengr

回答

1

看起來行必須調用另一個線程,當調用Sort時還沒有完成,因此SortDataBoundDataGridView_PerformCheck檢查的一些屬性尚未更新。

因此,解決方法是在該線程完成後調用該方法。一個放置它的好地方,它可以在用戶看到它們之前對數據成員進行排序,這是通過重寫表單的OnLoad方法並在那裏調用Sort來實現的。

相關問題