C# WinForms BindingSource PositionChanged事件引发了两次

C# WinForms BindingSource PositionChanged事件引发了两次,c#,winforms,C#,Winforms,这是我的项目: 在项目中创建一个新表单。然后创建两个按钮和一个bindingsource 对于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.DataSou

这是我的项目:

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

对于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;
}
private void button2_Click(object sender, EventArgs e)
{
    this.bindingSource1.DataSource = null;
}
private void bindingSource1_PositionChanged(object sender, EventArgs e)
{
    MessageBox.Show("hi");
}
然后为bindingsource添加一个PositionChanged事件,并编写以下代码:

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;
}
private void button2_Click(object sender, EventArgs e)
{
    this.bindingSource1.DataSource = null;
}
private void bindingSource1_PositionChanged(object sender, EventArgs e)
{
    MessageBox.Show("hi");
}
运行应用程序并按下按钮1。在按钮1中,我们将
数据源
设置为列表,并且
位置更改
被正常触发。没关系

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

如果编写
this.bindingSource1.Clear(),也会发生这种情况也是

为什么会发生这种情况?

原因是通过检查类的源代码

看起来,清除或将数据源设置为null会发出多个调用以引发PositionChanged事件。要在代码中避免此问题,只需在清除数据源之前解除事件挂钩,然后再次重新连接事件:

bindingSource1.PositionChanged -= bindingSource1_PositionChanged;
bindingSource1.DataSource = null;
bindingSource1.PositionChanged += bindingSource1_PositionChanged;
“为什么”是通过检查类的源代码

看起来,清除或将数据源设置为null会发出多个调用以引发PositionChanged事件。要在代码中避免此问题,只需在清除数据源之前解除事件挂钩,然后再次重新连接事件:

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