2009-02-23 78 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; 
}