扩展控制事件
本文关键字:事件 控制 扩展 | 更新日期: 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。