C# Winforms:触发哪个事件?combobox.selectedindexchanged或bindingsource.currentchanged

C# Winforms:触发哪个事件?combobox.selectedindexchanged或bindingsource.currentchanged,c#,winforms,combobox,event-handling,bindingsource,C#,Winforms,Combobox,Event Handling,Bindingsource,假设我们在winforms应用程序中有一个组合框,它的项绑定到绑定源 当用户更改组合框中的选定项时,我需要触发一个事件 我应该处理组合框。selectedindexchanged事件还是bindingsource.currentchanged事件。在性能或其他方面,哪一个更好 我找了很多东西想找到一篇文章或是关于它的一些东西,但找不到直接明了的东西。我很感激任何建议或解决办法 更新 在用户从组合框中选择一项后,我需要根据所选对象ID调用一个函数。(ID可从Combobox1.SelectedVa

假设我们在winforms应用程序中有一个
组合框
,它的项绑定到
绑定源

当用户更改组合框中的选定项时,我需要触发一个事件

我应该处理
组合框。selectedindexchanged
事件还是
bindingsource.currentchanged
事件。在性能或其他方面,哪一个更好

我找了很多东西想找到一篇文章或是关于它的一些东西,但找不到直接明了的东西。我很感激任何建议或解决办法

更新


在用户从组合框中选择一项后,我需要根据所选对象ID调用一个函数。(
ID
可从
Combobox1.SelectedValue
bindingSource1.Current.ID
访问)。在这种情况下,我应该选择哪个事件?

如果组合框绑定到BindingSource,您通常会将其保留在该位置。如果确实需要利用事件,最好在业务对象中创建更多属性。例如,如果组合框的索引值==0,则要禁用按钮,只需在业务对象中创建按钮的Enabled属性绑定到的属性,例如:

public virtual bool IsFunctionEnabled
{
  get { return (An_Items_SelectedIndex > 0); }
}
如果您真的需要在组合框的选定索引更改事件中执行某些操作,我会倾向于在表示层中执行,因为我不建议使用绑定源控件或其事件


最好的解决方案是处理业务对象中的所有内容,并通过BindingSources绑定控件。在表示层中执行任何逻辑都会使测试变得困难,更改BindingSources中的任何内容都会增加大量的测试。

如果组合框绑定到BindingSource,您通常会保留它。如果确实需要利用事件,最好在业务对象中创建更多属性。例如,如果组合框的索引值==0,则要禁用按钮,只需在业务对象中创建按钮的Enabled属性绑定到的属性,例如:

public virtual bool IsFunctionEnabled
{
  get { return (An_Items_SelectedIndex > 0); }
}
如果您真的需要在组合框的选定索引更改事件中执行某些操作,我会倾向于在表示层中执行,因为我不建议使用绑定源控件或其事件


最好的解决方案是处理业务对象中的所有内容,并通过BindingSources绑定控件。在表示层中执行任何逻辑都很难测试和更改BindingSources中的任何内容。这会增加大量测试。

如果您希望在最终用户选择UI中的任何项目时处理事件,则应使用
组合框。selectedindexchanged
,因为可以为数字触发
bindingsource.currentchanged
原因,如MSDN博客中提到的,所以,如果您需要处理MSDN中提到的任何原因导致的事件,那么它将不必要地通过您可能为选择更改事件编写的逻辑。处理事件时,您的代码应该是特定的。

如果您希望在最终用户选择UI中的任何项目时处理事件,则应使用组合框。selectedindexchanged,因为
bindingsource.currentchanged
可能会因MSDN博客中提到的一些原因触发,因此在这种情况下,由于MSDN中提到的任何原因,您需要处理事件,然后它将不必要地通过您可能为选择更改事件编码的逻辑。在处理事件时,您的代码应该是特定的。

毕竟,我知道最好使用
组合框。SelectedIndexChanded
事件,因为我正在与用户交互并从UI中寻找响应。虽然这里的事件对我来说也一样,但是如果我想从任何地方跟踪当前对象的更改,比如列表更改或其他,而不是完全从UI跟踪,则可以使用
Bindingsource.CurrentChanged
event。我认为在这里使用
combobox
事件更好

毕竟,我开始知道最好使用
组合框。SelectedIndexChanded
事件,因为我正在与用户交互并从UI中寻找响应。虽然这里的事件对我来说也一样,但是如果我想从任何地方跟踪当前对象的更改,比如列表更改或其他,而不是完全从UI跟踪,则可以使用
Bindingsource.CurrentChanged
event。我认为在这里使用
combobox
事件更好

我相信这两个事件之间不应该有性能差异,但是组合框。SelectedIndexChanged事件在这种情况下感觉更自然,不是吗?就个人而言,我认为你应该选择与你实际需要做的事情相匹配的事件。如果您的响应是面向数据的,请使用
BindingSource
,如果您需要使用UI,请使用
组合框。这样,事件处理程序就可以保留在与组件实际相关的地方。但是,这假设您在将UI代码与业务逻辑分离方面做得很好,这是大多数Winforms程序员无法做到的。在用户从组合框中选择一项后,我需要基于所选对象
ID
调用一个函数。(
ID
可从
Combobox1.SelectedValue
bindingSource1.Current.ID
访问)。在这种情况下,我应该选择哪个事件?我开始知道最好使用
组合框。selectedIndexChanded
事件,因为我正在与用户交互并从UI中寻找响应。虽然这里的事件对我来说也一样,但是如果我想从任何地方跟踪当前对象的更改,比如列表更改,而不是UI,则可以使用
bindingsource.currentchanged
event。最好在这里使用组合框事件。我认为不应该