好的,所以我有一个我正在构建的表单,它将通过使用自定义控件来更改它的界面。我想要做的是在创建一个新控件之前进行几次检查,比如检查一个是否已经启动。我有一切正常工作,但我似乎无法动态创建新控件,而无需在运行检查失败之前创建它。
控件都实现了一个名为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方法并将其传递给引用。
任何人都知道我该怎么做?
答案 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>();