2012-08-29 50 views
1

我在Windows Forms窗體上有很多事件。我有一個反饋標籤,我必須編寫feedbaxk.Text =「」;在每個事件的開始。替代Windows窗體中的PageLoad

ASP.NET中,我一直使用在每次回發觸發的page_load事件中只寫一次,但Form Load僅觸發一次。

我試圖與我的問題的標題進行搜索,發現以下兩個最接近的答案:

有一些相關的伴侶里亞爾,但我無法從這些和更多的東西得到滿意的答案。

如何在Windows窗體中檢測到事件將被觸發?

更新:谷歌搜索它的另一種方式,我發現這是與其他鏈路鏈接的密切聯繫,Find all event handlers for a Windows Forms control in .NETIs it possible to 「steal」 an event handler from one control and give it to another?。草草看完之後我認爲這是可能的,如果

  1. 我能得到一個雙贏的形式,所有的事件列表中的Form_Load結束(在那之後我不添加任何更多的事件)說。然後爲所有事件添加一些常用功能(比如更改標籤文本)。
  2. 我可能能夠繼承父級的所有事件,並在該事件中添加所需的功能,然後爲每個事件添加(覆蓋)特定功能。
+1

由於基礎Windows消息到達Form窗口句柄而引發了許多事件(並非全部),因此您可以重寫受保護的Form.WndProc方法並嘗試編寫一些catch-all系統。根據你想要最終達到的目標,這可能是一個開始。 –

+0

@SimonMourier說了我的第二點。連接到WndProc應該足以滿足你的需求。 –

+0

我正在SimonMourier指導下工作。 @Lief!它不僅僅是關於buttonclick,而是關於所有事件,例如任何添加的事件。一個textbox_leave一個combobox_selectedIndex_Changed一個textbox_backgroudColorChanged等... – Sami

回答

0

您可以使用AOP來做到這一點。使用Unity(Unity應用程序塊)框架來裝飾Windows窗體表單中的所有事件方法。在事件方法調用之前調用您的自定義方法。

使用反射和proxy pattern很容易做和隱藏代碼。相關文章是Aspect-Oriented Programming, Interception and Unity 2.0

+0

好吧。感謝您的指導,我會研究這些事情,並嘗試更新,因爲此刻我不知道這些事情。這對我來說似乎是一件困難的事情。 – Sami

+0

我明白,但這是正確做到這一點的唯一方法。你也可以把所有的窗體事件關聯到同一個方法,但是它會非常困難(在像控制器這樣的方法中,你必須檢測哪個控件和哪個事件通過一個大開關的情況在好的方法上路由它,它是艱難的,非常糟糕)... –

+0

aop是所有橫向過程(技術日誌,安全...)的答案。有一天足以下載統一和設置aop,你會看到很容易;-) –

2

它取決於你想要處理的任何特定事件,因爲在你的窗口中你可以有調整大小,點擊,移動等事件。看着你提到的引用ASP.NET的觀點,似乎你想要通過一些按鈕點擊來處理這個問題。

您可以嘗試覆蓋WndProc並處理WM_COMMAND消息。如果你想在某些特定的按鈕點擊處理這個,那麼我會說你爲每個按鈕處理這個。

+0

+1。重寫WndProc。你會發現在ASP.NET回發中會發生更多的事情,所以你需要特別過濾這些消息以「從流水中啜飲」,所以你只需要處理你關心的事情關於。 – tomfanning

+0

對。我嘗試它。根據需要,所有事件都需要一個共同事件。意思是不會發生commont事件不會被觸發的事件,天氣是一個組合框或點擊按鈕的選定索引更改 – Sami

0

如果你想在所有按鈕點擊事件上運行一些代碼,你可以創建一個像下面這樣的幫助方法,它將一個方法附加到窗體上所有按鈕的click事件處理程序中。

public static class UIHelper 
{ 
    public static void RegesterButtonClicks(Form form, EventHandler method) 
    { 
     foreach (Control control in form.Controls) 
     { 
      if (control is Button) 
      { 
       control.Click += method; 
      } 
     } 
    } 
} 

然後創建您的方法來運行所有按鈕點擊。例如:

private void OnButtonClick(object sender, EventArgs e) 
{ 
    //Code for all clicks here 
} 

然後在InitializeComponent()下添加下面的代碼行;在構造函數中

UIHelper.RegesterButtonClicks(this, OnButtonClick); 

線你也可以擴展輔助方法,該方法附加到其他活動和其他類型的控件,以及如果你需要的。