动态创建控件的新实例

时间:2013-12-22 04:40:08

标签: c# controls instance

好的,所以我有一个我正在构建的表单,它将通过使用自定义控件来更改它的界面。我想要做的是在创建一个新控件之前进行几次检查,比如检查一个是否已经启动。我有一切正常工作,但我似乎无法动态创建新控件,而无需在运行检查失败之前创建它。

控件都实现了一个名为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();
    }
}

我不想在运行check方法之前创建自定义控件的新实例,例如:JobForm newJobForm = new JobForm();,我想将引用传递给check方法然后让它创建新实例之后检查完成。通过这种方式,无论我最多添加多少新的自定义控件添加到应用程序,我只需要设置一个是创建引用变量,然后为按钮调用check方法并将其传递给引用。

任何人都知道我该怎么做?

2 个答案:

答案 0 :(得分:0)

我认为你正在考虑这个问题。而不是说“我控制X,它有效吗?”认为“控制X是有效的,如果是这样的话”。您想要检查控件是否有效,但是您想要发送对该控件的引用。

您的代码不会检查特定类型的控件,而只是至少有一个属于当前表单的控件实现您的界面。如果这是预期的行为,只需要一个初始检查功能,以查看表单上是否存在任何ICustomControl。如果该函数返回false,则继续创建。

答案 1 :(得分: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>();