2012-02-07 189 views
0

我想從一個類冒泡一個事件到一個自定義用戶控件。我的用戶控件基本上是一個數據表。Winforms冒泡事件

Sheet 
    -> List<Row> Rows 
    ->List<Cell> Cells 

我的UC(工作表)有一個行(類)列表,每行有一個單元格(類)列表。我的問題是..我怎樣才能從單元格中提取事件,表單可以捕獲?

回答

0

如果您的單元格知道表單,則可以在表單上引發事件。例如:

{ 
    ... some code ... 
    Sheet.RaiseCellChanged(this.CellId); 
} 

當然,每個單元格必須有一種引用它所在表單的方法(使用上面示例中的Sheet屬性)。

另一個更雜亂的選項是讓工作表訂閱所有單個單元格上的事件。這將是更多的工作,但至少Cell不必知道他們所在的工作表。

編輯: 要回答你的額外問題,性能方面並沒有真正的區別。使用第一種方法編寫代碼會更容易,因爲您的Sheet或任何其他對象只需訂閱單個事件即可接收來自任何更改單元格的數據(假設這是您想要的) 。

+0

這將工作,如果我有辦法引用表..我認爲我的工作。但我可以問,表現明智,你給了兩個選擇之間最好的是什麼?.. – noisyass2 2012-02-07 10:26:57

0

在WinForms中實際上不可能冒泡事件,因此您可能需要在圖紙級別添加/刪除行或單元格的某些功能。

通過補差,以表你將可以在創建/刪除訂閱/退訂從細胞的活動,也將能夠從消費者隱藏內部表的結構/創建過程:

public class Sheet 
{ 
    .... 

    public void AddRow(object[] values) 
    { 
     var row = new Row(); 
     foreach(var val in values) 
     { 
      var cell = new Cell(val); 
      cell.CellChanged += MyCellChangedHandler; 
     } 
    } 
} 

public class Cell 
{ 
    .... 

    public Cell(object value) 
    { 
     var eventProvider = value as IMyEventProvider; //can be anything you want, INotifyPropertyChanges? 
     if (eventProvider != null) 
      eventProvider.SomeEvent += SomeEventHandler; 
    } 

    public SomeEventHandler(...) 
    { 
     if (CellChanged != null) CellChanged(...); 
    } 
} 

通過這樣做,你將避免細胞知道表單以及如何調用表單和哪些方法等(這顯然不是他們關心的問題),單元格只是在事件發生變化時引發事件,如果有人聽(表單)他們不關心。