2012-09-05 26 views
0

我剛開始把我的GUI應用程序分解成UserControls。我有一堆TagePages的TabControl。顯然,我的MainForm.cs文件中充滿了大量的事件和控件等,它很快就變得非常混亂。正確的UserControl用法?

因此,前面的問題讓我深入瞭解如何創建UserControl。我打算爲每個TabPage創建一個UserControl,我想知道如何與主窗體或其他UserControls上的組件進行交互。

這是我使用UserControl製作的TabPage的一個示例,需要啓用或禁用取決於當前選擇哪個TabPage的按鈕。這是正確的用法還是有更好的方法?

public partial class TabDetails : UserControl 
{ 
    private RequestForm fRequestForm; 
    public TabDetails() 
    { 
     InitializeComponent(); 
    } 

    public void CustomInitialization(RequestForm pRequestForm) 
    { 
     fRequestForm = pRequestForm; 
     pRequestForm.TabControl_Main.SelectedIndexChanged += SelectedTabIndexChanged; 
    } 

    private void SelectedTabIndexChanged(object pSender, EventArgs pEvents) 
    { 
     fRequestForm.Button_SubmitRequest.Enabled = fRequestForm.TabControl_Main.SelectedTab != fRequestForm.Tab_Details; 
    } 
} 

在MainForm.cs構造我打電話:

this.tab_Details1.CustomInitialization(this); 
+0

編號使用事件。 –

+0

這裏顯然有一個事件在使用,這會讓你的評論更加無用。嘗試更具描述性或圍繞您的意思提供更多細節。 – Tada

+1

您的頁面可以瞭解有關您的用戶控件的詳細信息。但是,您的用戶控件不應該關心包含它的頁面上的任何內容。否則,最終只能在一種類型的頁面上使用用戶控件。 – RobH

回答

3

這看起來並不像一個良好的使用用戶的控制。用戶控件不應該決定在用戶​​控件中更改某些內容時,表單中的內容應該如何處理。用戶控件應該不知道它的容器,並且應該在任何容器中運行。

用戶控件應該通知窗體某些內容已經更改,而不告訴內部實現是什麼,表單應該決定要做什麼。

示例: 名爲「NameUserControl」的用戶控件由TitleComboBox,FirstNameTextBox和LastNameTextBox組成。用戶控件希望在其中一個值發生更改時通知。

錯誤方式:

創建活動:

TitleComboBox - 的SelectedIndexChanged。 FirstNameTextBox,LastNameTextBox - TextChanged。

這裏的問題:

  1. 你暴露的內部控制行爲。如果您想將TitleComboBox更改爲TextBox,會發生什麼情況?您必須更改事件名稱和實施。
  2. 您公開了一個事實,即您正好使用3個不同的控件。如果您想爲姓和名使用相同的文本框會發生什麼?您必須刪除一個事件並更改另一個事件的名稱。

好方法:

只創建一個單一的事件:NameChanged和揭露全名的房產或爲價值觀三個不同的特性。

無論哪種方式,表單訂閱事件並決定接下來要做什麼。

另一件需要考慮的事情是:您越多地爲用戶控件添加更多功能,您可能會使其重複使用次數減少,或者使代碼更加複雜。例如,如果您在用戶控件中添加驗證,您會發現有一天您不需要驗證就需要它,所以您將添加一個屬性「bool ValidateData」,否則它將非常複雜,您需要構建另一個控制。解決這個問題的一種方法是構建非常小的用戶控件,但將它們組合到一個或多個更大的用戶控件中,以滿足您當前的所有需求。

+0

當你說「用戶控件應該通知表單有什麼改變而不告訴內部實現是什麼,表單應該決定該怎麼做」。你能給我舉個例子嗎?就像表單訂閱UserControl中的一個事件一樣? – Tada

+1

添加例子 –

+0

感謝Amiram這個例子,我認爲這對我來說是非常好的角度。 – Tada