扩展控制事件

时间:2014-08-13 16:55:39

标签: c# winforms events

我想要实现的是创建自定义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!
    }
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您的DataBindings没有变化。您的DataSource正在添加新项目。那是不同的。

您可以使用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。