2009-02-23 101 views
2

我正在C#winforms項目中工作,我有一個用戶控件,它從工具條菜單中選擇加載。我有一個字典查找設置發生在其他功能的用戶控件的表單加載。另外,當我關閉用戶控件時,我只使用「.Hide();」方法。我注意到,當我第一次加載用戶控件時,一切都很好,但是當我關閉它並選擇第二次打開它時,它會創建對象的新實例,從而拋棄我的字典查找。因此,我寫了一些代碼試圖解決這個問題。動態創建用戶控件在C#

我需要做的是以某種方式說,如果用戶控件的一個實例已經存在,請不要創建該對象的新實例。相反,只需使用戶控件再次可見即可。所以我寫了代碼試圖達到這個目的。當我第一次選擇該項目時,一切都很好。當我隱藏用戶控件並嘗試再次打開時,沒有任何反應。

以下是我爲這個目的而發生在該項目從工具條菜單中選擇編寫的代碼:

 if (Controls.ContainsKey("CheckAvailUserControl")) 
     { 
      Controls["CheckAvailUserControl"].Dock = DockStyle.Fill; 
      Controls["CheckAvailUserControl"].Visible = true; 
      Controls["CheckAvailUserControl"].Show(); 
      Controls["CheckAvailUserControl"].Refresh(); 
     } 

     else 
     { 
      UserControl checkAvailUserControlLoad = new CheckAvailUserControl(); 
      Controls.Add(checkAvailUserControlLoad); 
      checkAvailUserControlLoad.Dock = DockStyle.Fill; 
      checkAvailUserControlLoad.Visible = true; 
      checkAvailUserControlLoad.Show(); 
     } 

當我通過我的代碼在調試跟蹤它實際上是在擊中上面的if/else語句的正確部分。它只是在我第二次嘗試加載它時沒有在屏幕上顯示用戶控件。

問題是:如何關閉用戶控件後正確加載,然後再從工具條菜單中選擇它?

+0

問題是什麼? – 2009-02-23 19:24:55

+0

現在的問題是: 如何讓用戶控件在關閉後正確加載,然後再次從工具條菜單中選擇它? – 2009-02-23 20:28:39

回答

9

我認爲Controls.ContainsKey(...)總是返回false,因爲您在創建控件時從未爲您的控件分配過名稱。

如果,當你創建的控制,你說

//... 
checkAvailUserControlLoad.Name = "Something" 
//... 
Controls.Add(checkAvailUserControlLoad); 

然後

Controls.ContainsKey("Something") 

將返回true,你就可以通過使用Controls["Something"]

重新使用控制
1

這可能會奏效,但我認爲它稍微有些倒退:您將新代碼拋出一個可以通過移動舊代碼來解決的問題。

相反,請考慮事件如何在您的表單中工作。我敢打賭,如果您將創建的代碼移動到稍微不同的事件,或者稍後檢測事件何時被觸發並忽略這些事件,則可以更好地解決問題。

2

在這裏你去:

private void button_Click(object sender, EventArgs e) 
{ 
    // pass in the containing panel 
    LoadControl<MyControls.MyControl>(panelContainer); 
} 

void LoadControl<T>(Panel panel) where T : Control, new() 
{ 
    T _Control = GetControl<T>(panel); 
    if (_Control == null) 
    { 
     _Control = new T(); 
     _Control.Dock = DockStyle.Fill; 
     panel.Controls.Add(_Control); 
    } 
    _Control.BringToFront(); 
} 

T GetControl<T>(Panel panel) where T : Control 
{ 
    Type _Type = typeof(T); 
    String _Name = _Type.ToString(); 
    if (!panel.Controls.ContainsKey(_Name)) 
     return null; 
    T _Control = panel.Controls[_Name] as T; 
    return _Control; 
}