2013-12-22 153 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>();