2013-12-22 148 views
0

好了,所以我有一個表格,我構建將改變它的界面通過使用自定義的控件。我想要做的是在創建新控件之前進行幾次檢查,例如檢查是否已經啓動。我有一切正常工作,但我似乎無法動態地創建新的控制,沒有創建它之前運行檢查失敗的目的。創建控件的新實例動態

的控件都實現所謂ICustomControl的接口,並從MasterControl繼承。然後,我有叫JobForm自定義控件,和主窗體上按鈕調用像這樣的方法:Check_Controls(newJobForm)

JobForm newJobForm; 

private void Check_Controls(Control control) // Checks current controls to see if a new one can be opened 
{ 
    bool currentControl = false; 

    foreach (Control c in this.Controls) 
    { 
     if (c is ICustomControl && c != masterControl) 
      currentControl = true; 
    } 

    if (currentControl) 
    { 
     TimedMessageBox timedMessage = new TimedMessageBox("There is currently an open form. Please close the current control before opening another."); 
     timedMessage.ShowDialog(); 
    } 
    else 
    { 
     Control c = (Control)Activator.CreateInstance(control.GetType()); 
     this.Controls.Add(c); 
     Position_Control(c); 
     c.Show(); 
    } 
} 

我dont't要創建一個類似的自定義控件的新實例:JobForm newJobForm = new JobForm();運行前檢查方法,我想傳遞檢查方法的引用,然後讓它在檢查完成後創建新實例。通過這種方式,無論我在添加到應用程序中添加了多少新的自定義控件,我只需要創建一個參考變量,然後爲該按鈕調用check方法並將其傳遞給參考。

任何人都知道我該怎麼做?

回答

0

我認爲你是倒着思考的問題。而不是說「我有控制X,它有效嗎?」認爲「會控制X有效,如果是這樣創建」。您想要進行檢查以查看控件是否有效,但是您想要發送對該控件的引用。

您的代碼不檢查特定類型的控制,而只是屬於當前形式的至少一個控制實現你的接口。如果這是預期的行爲,那麼只需要一個函數來執行初始檢查,以查看錶單上是否存在任何ICustomControl。如果該函數返回false,則隨你的創建一起進行。

+0

如果我沒有理解你正確的,那就是我已經在做的事......也許你不明白我想要完成什麼。我有很多按鈕,每個按鈕打開一個不同的控件,但我不想要任何重疊的控件,我只想要一次打開一個控件...因此,我正在檢查是否有任何控件當前打開,如果他們告訴用戶不,並且他們是否打開控制。很多代碼都是相同的,所以我試圖將它凝聚成一個簡單的方法,打開傳遞給它的任何控制。 –

+0

對,我說你應該將支票與創作分開。某處您已經創建了這些實例以傳遞到您的現有函數中。我建議的是讓你的函數只進行檢查,而不是創建,並且如果控件創建有效,就讓它返回一個bool。如果它是有效的,那麼可以使用現有的創建邏輯。 – brcpar

+0

啊,呀我想過這樣做,我只是希望,而不必寫出來的每個創作有一個辦法凝結那魔成一個通用的方法。 –

0

您可以通過使用一個通用的約束與單一功能的實現這一點。這也可以讓你使用Activator和動態類型的生成其它反射法的低於理想的做法走:

private void CheckAndAddControl<ControlType>() 
    where ControlType : MasterControl, new() 
{ 
    bool currentControl = false; 

    foreach (Control c in this.Controls) 
    { 
     if (c is ControlType) 
     { 
      currentControl = true; 
      break; 
     } 
    } 

    if (currentControl) 
    { 
     TimedMessageBox timedMessage = new TimedMessageBox("There is currently an open form. Please close the current control before opening another."); 
     timedMessage.ShowDialog(); 
    } 
    else 
    { 
     var c = new ControlType(); 
     this.Controls.Add(c); 
     Position_Control(c); 
     c.Show(); 
    } 
} 

你會再使用此功能如下:

CheckAndAddControl<JobForm>();