C#Windows窗体:BindingSource PositionChanged事件没有触发?

时间:2013-05-20 19:54:44

标签: c# winforms bindingsource

我使用List作为数据,使用bindingSource获得了一个简单的winform。我想在绑定源位置发生变化时采取行动。阅读,看起来'positionChanged'事件就是我所需要的。但是,在我的应用程序中,我无法触发此事件。

有一个bindingNavigator可以使用bindingSoure进行导航和(用于调试)一个更改当前绑定源位置的按钮。

我试图尽可能简化这一点。我的表单代码如下所示:

public partial class Form1 : Form
{
    protected List<int> data;

    public Form1()
    {
        InitializeComponent();
        data = new List<int>();
        data.Add(4);
        data.Add(23);
        data.Add(85);
        data.Add(32);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        bindingSource1 = new BindingSource();
        bindingSource1.DataSource = data;
        bindingNavigator1.BindingSource = this.bindingSource1;            
    }

    private void bindingSource1_PositionChanged(object sender, EventArgs e)
    {
        // Debugger breakpoint here. 
        // Expectation is this code will be executed either when
        // button is clicked, or navigator is used to change positions. 
        int x = 0; 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bindingSource1.Position = 2;
    }
}

在设计器中自动生成eventHandler:

        // 
        // bindingSource1
        // 
        this.bindingSource1.PositionChanged += new System.EventHandler(this.bindingSource1_PositionChanged);

现在,麻烦的是每当我运行它时,'PositionChanged'事件就不会触发。我已经验证了bindingSource1.Position会根据导航器和按钮进行更改。但无论我做什么,事件都不会实际发生。我猜这在这一点上是非常愚蠢的,或者我完全误解了事件应该触发的时间。

使用.NET 4.5

1 个答案:

答案 0 :(得分:3)

问题出在您的Form_Load

private void Form1_Load(object sender, EventArgs e)
{
    // this overrides the reference you have created in the desinger.cs file
    // either remove this line 
    bindingSource1 = new BindingSource(); 
    // or add this line  
    //  bindingSource1.PositionChanged += bindingSource1_PositionChanged;
    bindingSource1.DataSource = data;
    bindingNavigator1.BindingSource = this.bindingSource1;   
}

创建新对象new BindingSource()时,它没有订阅事件PositionChanged。这就是为什么你永远不会达到你的断点。