DataGridView.DataSource使用赋值运算符更新时,将DataSourceChanged调用事件处理程序.你不能在C#中重载赋值操作,那么如何在内部调用事件处理程序?
public void foo(){
this.dataGridView.DataSourceChanged += new EventHandler(bar);
this.dataGridView.DataSource = dt;
}
//this handler is called after datasource changes
private void bar(object sender, EventArgs e) {}
Run Code Online (Sandbox Code Playgroud)
DataSource 作为财产实施.
private object _dataSource;
public object DataSource {
get
{
return _dataSource;
}
set
{
if (value != _dataSource) {
_dataSource = value;
UpdateTheDataGridView();
RaiseTheDataSourceChangedEvent();
}
}
}
Run Code Online (Sandbox Code Playgroud)
读/写属性是一组两个方法,当您访问该属性时会自动调用这两个方法; set当您分配值时,get当您阅读该属性时.
这取决于事件究竟它做什么,但我认为事件的像特性-除了,而不是一个getter和setter方法,你必须add和remove行动,每个采取委托从事件订阅或退订/.
甲字段样在C#事件实现使用字段为代表固定的添加/删除实现的情况下,以及-有点像自动地实现属性.但你可以在一个add或remove处理程序中做任何你喜欢的事情.
有关更多信息,请参阅有关委托和事件的文章.
至于数据源本身 - 它不是指定一个字段 - 它分配给一个属性,所以再次,它可以做任何想做的事情,包括提升DataSourceChanged事件.
你要问的并不完全清楚.如果您正在询问属性设置器如何执行某些操作:属性设置器是一种方法.它像任何其他方法一样工作.在这种情况下,当调用属性setter时,它会检查是否需要引发事件,如果是,则会引发事件.
如果你问的是事件本身是如何实现的,Jon的文章当然很棒.如果您正在寻找有关如何在C#中实现事件的其他技术分析,以及实现如何随时间发生变化,请参阅Chris Burrows关于该主题的博客文章:
http://blogs.msdn.com/b/cburrows/archive/tags/events/
从底部开始.
Chris是开发人员,他为编译器的语义分析和代码生成设计并实现了许多变化.