2017-04-03 128 views
0

假設我們在一個winforms應用程序中有Combobox,它的項目綁定到BindingsourceWinforms:哪個事件觸發? combobox.selectedindexchanged OR bindingsource.currentchanged

我需要在用戶更改combobox中的選定項目時觸發事件。

我是否應該處理combobox.selectedindexchanged事件或bindingsource.currentchanged事件。性能或其他方面哪個更好?

我搜索了很多,找到一篇文章或關於它的東西,但找不到直接和明確的東西。我很欣賞任何建議或解決方法。

UPDATE

我需要調用用戶後所選擇的對象ID上的功能基從combobox選擇一個項目。 (ID可從Combobox1.SelectedValuebindingSource1.Current.ID訪問)。在這種情況下,我應該選擇哪個事件?

+0

我相信這兩個事件不應該有性能差異,但是'combobox.SelectedIndexChanged'事件在這種情況下感覺更自然,不是嗎? – swdev95

+0

[哪個更快?](https://ericlippert.com/2012/12/17/performance-rant/) –

+1

就我個人而言,我認爲您應該選擇與您實際需要使用的事件相匹配的事件。如果您的響應是面向數據的,那麼使用'BindingSource',如果您需要使用UI,則使用'ComboBox'。這樣,事件處理程序可以保留在實際相關的組件中。但是,這假設你已經完成了一項很好的工作,首先讓你的UI代碼與業務邏輯分離開來,這是大多數Winforms程序員無法做到的。 –

回答

0

畢竟,我開始知道應該使用Combobox.SelectedIndexChanded事件,因爲我正在與用戶進行交互並尋找UI的響應。雖然這裏的事件對我來說也一樣,但Bindingsource.CurrentChanged事件可用於我想要跟蹤當前對象更改的任何地方,如列表更改或其他內容,而不是UI。我相信在這裏最好使用combobox事件。

0

如果一個ComboBox綁定到一個BindingSource,你通常會把它留在那。如果您確實需要利用事件,則最好在業務對象中創建更多屬性。例如說,你想如果ComboBox指數值== 0來禁用一個按鈕,只需創建該按鈕的啓用屬性綁定到,例如,在業務對象的屬性:

public virtual bool IsFunctionEnabled 
{ 
    get { return (An_Items_SelectedIndex > 0); } 
} 

如果你真的需要在ComboBox所選擇的索引更改事件中執行某些操作,因爲我不推薦使用綁定源控件或它們的事件。

最好的解決方案是處理業務對象中的所有內容,並通過BindingSources綁定您的控件。在Presentation Tier中執行任何邏輯都會使測試變得困難,並且在BindingSources中更改任何內容都會添加大量測試。

+0

以上是對過於寬泛,主要是基於觀點的問題的恰當迴應(即,應該沒有回答的問題第一名)。也就是說,我不同意上面的_specifics_。即你的業務邏輯不應該在乎它有一個按鈕,沒關係有一個名爲'IsButtonEnabled'的屬性。業務邏輯應該關注與UI無關的命令,其中命令可以被啓用/禁用,然後UI相應地啓用/禁用適當的部分(主要是按鈕和菜單項)。 –

+0

_「...只需在業務對象(BO)中創建Button ...的Enabled屬性(顯示名爲IsFunctionEnabled的引用An_Items_SelectedIndex的屬性)...最佳解決方案是處理業務中的所有內容對象「 - 不同意。 BO不應該關心用戶界面 – MickyD

+0

我相信這在BL中處理並不複雜。只是一個簡單的函數調用。我只是混淆了選擇哪個事件。 – vaheeds

0

如果您希望最終用戶選擇在UI的任何項目,那麼你應該用combobox.selectedindexchanged因爲bindingsource.currentchanged可以觸發如這裏提到的MSDN博客數量的理由去處理事件,BindingSource.CurrentChanged Event這樣的情況下,你需要處理的事件爲MSDN中提到的任何原因,那麼它將不必要地通過您可能已編碼的選擇更改事件的邏輯。您的代碼應該是特定的,同時處理事件。

+0

你是說如果'BindingSource.Current'屬性更改,綁定的'ComboBox'不會有_its_當前選擇更改爲匹配? –