C# WinForms BindingSource PositionChanged事件引发了两次
这是我的项目: 在项目中创建一个新表单。然后创建两个按钮和一个bindingsource 对于button1,请编写以下代码: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
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;