WinForms BindingSource PositionChanged事件引发了两次

时间:2016-08-08 16:58:10

标签: c# winforms

这是我的项目:

在项目中创建新表单。然后创建两个按钮和一个bindingsource。

for button1编写此代码:

private void button1_Click(object sender, EventArgs e)
{
    List<int> lst = new List<int>();
    lst.Add(1);
    lst.Add(3);
    lst.Add(3);

    this.bindingSource1.DataSource = lst;
}

for button2编写此代码:

private void button2_Click(object sender, EventArgs e)
{
    this.bindingSource1.DataSource = null;
}

然后为bindingsource添加一个PositionChanged事件并编写以下代码:

private void bindingSource1_PositionChanged(object sender, EventArgs e)
{
    MessageBox.Show("hi");
}

运行应用程序并按下按钮1。在button1中,我们将DataSource设置为列表,并正常触发PositionChanged。好的。

然后按下按钮2。我们只需将DataSource设置为null。但它显示了两条消息。您会看到PositionChanged事件被触发两次。

如果你也写this.bindingSource1.Clear();,也会发生这种情况。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

“为什么”是通过检查BindingSource类的源代码。

它看起来像清除或将DataSource设置为null进行多次调用以引发PositionChanged事件。要在代码中避免使用它,只需在清除DataSource之前取消挂钩事件,然后重新连接事件:

bindingSource1.PositionChanged -= bindingSource1_PositionChanged;
bindingSource1.DataSource = null;
bindingSource1.PositionChanged += bindingSource1_PositionChanged;