2013-05-16 142 views
0

我有幾個ControlToolStripMenuItemButton需要有一個函數綁定到他們的點擊事件。他們將生成新的Form或將TabPage添加到當前的TabControl。我可能會得到幾個不同的Control,它們需要相同的功能,所以我想到了創建一個全局函數庫。全局函數庫

我將有一個名爲Services類看起來像這樣:當程序啓動和全球存儲,因此它可以在任何地方訪問

public class Services { 
    TabControl container; 
    delegate void fonction(int id); 
    Dictionary<string, fonction> functions = new Dictionary<string, fonction>(); 

    public Services(TabControl control) { 
     container = control; 
     InitFunctions(); 
    } 

    public Delegate Getfunction(string name) { 
     if (functions.ContainsKey(name)) 
      return functions[name]; 
     else 
      throw new NotImplementedException("Failed to instantiate " + name); 
    } 

    // List of all the desired functions 
    // Function example 
    private void ProductLoan(int id) { 
     string name = "Loan"+id.ToString(); 
     Form newForm = new Loan(); 
     newForm.Text = Properties.Resources.MakeLoan; 
     newForm.ShowDialog(); 
    } 
    private void InitFunctions() { 
     fonction f = new fonction(ProductLoan); 
     functions.Add("Loan", f); 
     // For each functions 
     // f = new fonction(name); 
     // functions.Add(name, f); 
    } 
} 

這個類實例化。 糾正我,如果我錯誤地繼續這樣做,但我沒有使Services類爲靜態,因爲它需要有一個TabControl的實例並初始化函數列表。

我不知道如果這是一個好主意,所以我希望得到一些建議。

+1

您可以在加載時將靜態分配'TabControl'一次。我更喜歡靜態成員做「通用事物」 – lcssanches

+0

有趣,但我仍然需要初始化函數列表。儘管「服務」類可能是飽和的,因爲不需要參數。我唯一擔心的是任何程序員都可以嘗試獲得一個函數,即使他沒有分配TabControl。我想確保使用'Services'的唯一方法是當它具有TabControl實例/引用並初始化函數列表時。 –

+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

你在使用什麼編程環境?我知道在Visual Studio中,如果有多個控件使用相同的方法,則可以在某個單擊事件下創建該方法,然後,對於需要相同方法的每個控件,可以通過控件實際綁定來綁定該方法到您添加該方法的第一個控件的單擊事件。就創建一個包含每個函數所需的存儲庫而言,我總是有更好的運氣來製作單獨的點擊事件,我建議只讓一個類來保存這些函數並使其成爲靜態的。由於服務需要首先實例化其他內容,只需實例化TabControl,然後實例化持有方法的靜態類。

+0

這確實是我使用的Visual Studio。第一個讓click事件綁定的控件是'ToolStripMenu'。我如何使用它在其他控件中生成的動態功能對我來說還是一個謎。我可能需要在整個程序中傳遞我的菜單。 –

+0

你不會把它傳遞給這個地方_depending_該方法應該做什麼。你可以做的是,在圖形編輯器中,點擊應該使用與你編碼的第一個「控制」相同的方法的「控制」。然後在側面的事件菜單下,點擊'OnClick'方法,並且應該有一個下拉菜單,允許您爲首先編程的任何「控制」選擇原始點擊方法 – David

+0

問題是我的菜單和我的控件是動態生成的,所以我不知道菜單將保存什麼功能,甚至不知道程序何時執行。 –

1

您可以使用公共實例方法創建類似TabControllerPopupController的東西,分別用於創建制表符和表單。 TabController將可能依賴於TabControlPopupContorller將依賴於父窗體(如果需要)。每個Control將擁有自己的事件處理程序,其中將調用TabControllerPopupController的方法。

UPD:

由於Controls是動態創建的,用於配線的事件處理程序的公共設施可以是一個好主意。但佈線邏輯應該與事件處理程序實現邏輯分開,以使其更具可讀性和可維護性。例如IntelligentEventHandlerWiringManager可能對TabControllerPopupController有依賴關係。

+0

我希望能爲我提供TabControl和新窗體的服務。所以我最終會擁有兩個控制器的「服務」。 –

+0

主要思想是,如果可以直接調用實例方法,則不需要具有委託的字典。至於TabController和PopupController的分離 - 他們似乎有不同的責任。兩個自然依賴關係對我來說比單一依賴關係更好,綜合性和完全不自然。 – OpenMinded