扩展控制事件

本文关键字:事件 控制 扩展 | 更新日期: 2023-09-27 18:18:03

我想要实现的是创建一个自定义的Chart控件,并在DataSource中的数据发生变化时执行某个函数。

自定义图表代码:

public partial class MyChart : Chart
{
    public StockChart()
    {
        InitializeComponent();
        DataBindings.CollectionChanged += new CollectionChangeEventHandler(OnDataChange);
    }
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
    private void OnDataChange(object sender, CollectionChangeEventArgs e)
    {
        MessageBox.Show("Data Changed");
    }
}
UI线程上运行的代码:
public class MyForm : Form
{
    BindingList<MyObject> Data;
    public MyForm()
    { 
        InitComponent();
        Data = new BindingList<MyObject>();
        mychart.DataSource = Data;
    }
    public void AddData(MyObject object)
    {
        Data.Add(object);
        //Here the OnDataChange should be triggered, but nothing happens!
    }
}

有人能帮忙吗?

扩展控制事件

您的数据绑定没有改变。您的数据源正在添加新项。这是不同的。

你可以使用OnBindingContextChanged方法:

public class MyChart : Chart {
  protected override void OnBindingContextChanged(EventArgs e) {
    ((BindingList<MyObject>)this.DataSource).ListChanged -= MyChart_ListChanged;
    ((BindingList<MyObject>)this.DataSource).ListChanged += MyChart_ListChanged;
    base.OnBindingContextChanged(e);
  }
  void MyChart_ListChanged(object sender, ListChangedEventArgs e) {
    // something happened in the list...
  }
}

但是这使得你的控制依赖于知道DataSource是一个BindingList<MyObject>集合。可能不是一个好的设计。考虑在窗体中只使用ListChanged事件,而声明了BindingList。