【问题标题】:Create a new instance of a control dynamically动态创建控件的新实例
【发布时间】:2013-12-22 04:40:07
【问题描述】:

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

这些控件都实现了一个名为 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 方法,然后让它在检查后创建新实例完全的。这样,无论我最终向应用程序添加了多少新的自定义控件,我所要做的就是创建引用变量,然后为按钮调用检查方法并将引用传递给它。

有人知道我该怎么做吗?

【问题讨论】:

    标签: c# controls instance


    【解决方案1】:

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

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

    【讨论】:

    • 如果我对您的理解正确,那就是我已经在做的事情......也许您不理解我想要完成的事情。我有很多按钮,每个按钮打开一个不同的控件,但我不想要任何重叠的控件,我只希望一次打开一个控件......因此我正在检查当前是否打开了任何控件,如果他们告诉用户不,如果他们没有打开控件。很多代码都是相同的,所以我试图将它压缩成一个简单的方法,打开传递给它的任何控件。
    • 对,我是说你应该把支票和创作分开。您已经在某处创建这些实例以传递到您现有的函数中。我的建议是让你的函数只做检查,而不是创建,如果控件创建有效,让它返回一个布尔值。如果它是有效的,在任何可能的地方使用你现有的创建逻辑。
    • 啊,是的,我想过这样做,我只是希望有一种方法可以将这种魔法浓缩成一个通用的方法,而不是每次创建都要写出来。
    【解决方案2】:

    您可以通过使用受约束的泛型通过单个函数来完成此操作。这也使您摆脱了使用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>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2013-11-14
      • 2017-09-28
      相关资源
      最近更新 更多