2010-12-20 98 views
4

我想在C#中的WinForms使用BindingList作爲DataSourceListBox,但每當我嘗試添加項目到BindingList時拋出ArgumentOutOfRangeException,我得到拋出的ArgumentOutOfRangeException。下面的代碼演示了此問題(假設形式ListBox listBox1):列表框添加到數據源

BindingList<string> dataSource = new BindingList<string>(); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test1"); // Exception, here. 

注意,如果dataSource中已經有項目,我沒有得到異常:

BindingList<string> dataSource = new BindingList<string>(); 
dataSource.Add("Test1"); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test2"); // Appears to work correctly. 

我可以解決通過在添加項目之前將DataSource屬性設置爲null並在之後重新設置DataSource,但感覺像是黑客,我希望能夠避免這樣做。

ListBox上使用空的DataSource是否存在(非黑客)方法,以便向其添加項目不會引發異常?

編輯:堆棧跟蹤:

System.Windows.Forms.dll的System.Windows.Forms.ListBox.SelectedIndex.set(INT 值)+爲0x1EC字節
System.Windows。 Forms.dll!System.Windows.Forms.ListControl.DataManager_PositionChanged(object sender,System.EventArgs e)+ 0x2e bytes
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnPositionChanged(System.EventArgs e)+ 0x39字節
System.Windows.Forms.dll的!System.Windows.Forms.CurrencyManager.ChangeRecordState(INT 在newPosition,布爾驗證,布爾 endCurrentEdit,布爾 firePositionChange,布爾pullData)+ 0x14f字節
System.Windows.Forms的。 dll的!System.Windows.Forms.CurrencyManager.List_ListChanged(對象 發件人, System.ComponentModel.ListChangedEventArgs E)+ 0x2e4字節
System.dll中!System.ComponentModel.BindingList.OnListChanged(System.ComponentModel.ListChangedEventArgs E) + 0x17字節
System.dll!System.ComponentModel.BindingList.FireListChang ED(System.ComponentModel.ListChangedType 類型,INT指數)+ 0x35字節
System.dll中!System.ComponentModel.BindingList.InsertItem(INT 索引,系統_ 佳能項)+ 0x3F的 字節
mscorlib.dll中!System.Collections.ObjectModel.Collection.Add(系統。
_Canon 項)+ 0x76字節

+0

沒有repro,發佈異常的堆棧跟蹤。 – 2010-12-20 20:15:23

+1

我感覺有點愚蠢 - 這是.Net在內部處理的一個例外;我的調試器被設置爲觸發所有拋出的異常。下一次,我會確保「繼續」,直到遇到實際的崩潰。 – TreDubZedd 2010-12-20 21:17:02

回答

2

事實證明,我已經在「例外」對話框(調試 - >例外)中檢查了一切。所以,這個異常存在,但是(默默地)由.Net框架處理。繼續執行程序會顯示預期的結果。

0

你可能有附加的一些事情對你ListBox可能會造成此事件處理程序?我無法重現您所描述的行爲。

我創建了一個完全空白的WinForms項目,以及綁定到一個BindingList<string>ListBox,增值「測試」列表(設置ListBox.DataSource屬性之後),以及該項目的「測試」出現在框中,作爲預期。

我想看看你的ListBox以及你的BindingList<string>,看看是否有一個你可能會失蹤的附加事件處理程序。

+0

我的問題存在於看起來與您所描述的配置相同的配置中,即具有單個ListBox的全新WinForms項目;沒有無關的事件處理程序。 – TreDubZedd 2010-12-20 21:05:19

+0

@TreDubZedd:這是一個標準的'System.Windows.Forms.ListBox'?目前我和漢斯在一起 - 不能再現你所看到的。堆棧跟蹤肯定會有幫助。 – 2010-12-20 21:08:39

+0

看起來它是.Net在內部處理的一個例外。哎呀。 – TreDubZedd 2010-12-20 21:15:39

0

我有同樣的問題,經過多次研究,我發現避免這種.Net錯誤的唯一解決方法是在列表不爲空時僅將BindingList分配給DataSource。

如果可以更改,可以製作一個虛擬對象,您始終保留在列表中,並且在列表不爲空時將其刪除。

最後,它不值得找到一種方法來避免ArgumentOutOfRangeException被拋出。