2012-03-27 50 views
3

當您使用賦值運算符更新DataGridView.DataSource時,將調用DataSourceChanged事件處理程序。您不能在C#中重載賦值操作,那麼事件處理函數如何在內部調用?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) {} 
+0

這是你遇到的問題還是一個普遍的問題? – 2012-03-27 20:56:16

+0

只是一個普遍的問題 – kefeizhou 2012-03-27 20:57:44

回答

6

DataSource作爲屬性實現。

private object _dataSource; 
public object DataSource { 
    get 
    { 
     return _dataSource; 
    } 
    set 
    { 
     if (value != _dataSource) { 
      _dataSource = value; 
      UpdateTheDataGridView(); 
      RaiseTheDataSourceChangedEvent(); 
     } 
    } 
} 

讀/寫屬性是一組兩種方法,當您訪問屬性時會自動調用該方法; set當您分配一個值時,get當您讀取屬性。

5

這取決於事件正是它做什麼,但我覺得事件像性能 - 除了,而不是一個getter和setter方法,你有addremove行動,每個採取委託訂閱或取消訂閱該活動。

A 字段樣 C#中的事件使用委託字段實現事件,並修復了添加/刪除實現 - 有點像自動實現的屬性。但是你可以在addremove處理程序中做任何你喜歡的事情。

有關更多信息,請參閱我的article on delegates and events

至於數據源本身 - 這不是分配 - 它分配給一個財產,如此反覆,可以做任何它想,包括提高DataSourceChanged事件。

6

這並不完全清楚你在問什麼。如果你問這個屬性設置器是如何做的話:屬性設置器是一種方法。它的工作原理與其他方法一樣。在這種情況下,當調用屬性設置器時,它會檢查是否需要提升事件,如果確實如此,則會引發事件。

如果你問事件本身是如何實現的,喬恩的文章當然是非常好的。如果你正在尋找的事件是如何在C#中實現,以及如何實現已經改變,隨着時間的推移額外的技術分析,請參見主題克里斯·伯羅斯的博客文章:

http://blogs.msdn.com/b/cburrows/archive/tags/events/

開始從底部。

Chris是設計和實現了許多編譯器語義分析和代碼生成變化的開發人員。

-1

事件處理程序在內部被調用,因爲提供事件的類(在本例中爲DataGridView)在其代碼中的某個點顯式激發事件。 DataSource的屬性設置器聽起來像是一個適當的地方來觸發這個特定的事件,但我沒有看到他的源代碼來確認。

我建議查找關於如何爲另一個課程提供自己的活動的簡單教程。它會讓你更好地瞭解事件的提供者如何在沒有太多細節的情況下工作。

0

數據源是一個屬性,事件處理程序在集合中被調用。

你可以使用ilspy來看看它是如何實現的。