我想要实现的是创建自定义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!
}
}
有人可以帮忙吗?
答案 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。