[英]Using a (to a class) unknown function
我检查表单是否已经打开。 如果不是,它将打开,如果是,它将激活表单并使用SwitchTab(int i)函数。 这是一些代码:
public partial class Insert : Form {
public Insert() {
InitializeComponent();
}
public Insert(int tab) : this() {
SwitchTab(tab);
}
public void SwitchTab(int tab) {
tabControl1.SelectedIndex = tab;
}
}
private void OpenInsert(int tab) {
// Loop through all forms
foreach (Form f in Application.OpenForms) {
// Check if form of Insert type is found
if (f.GetType() == typeof(Insert)) {
f.Activate();
// Unknown function
f.SwitchTab(tab)
return;
}
}
// Not found, open form
Insert insert = new Insert(tab);
insert.Show();
}
这背后的原因是“插入”表单具有多个选项卡,如果单击菜单中的其他按钮,我想切换选项卡。 问题是,在我想调用SwitchTab()函数的地方,编译器不知道它是一个Insert类,但只有在它通过时才通过。 因此,有什么方法可以强制让它知道它是insert的实例吗?
如果无法将对象强制转换为类,则使用as
强制转换返回null
。 此外,编译器还会检查是否完全可以进行强制转换:
foreach (Form f in Application.OpenForms) {
var fI = f as Insert;
// Check if form of Insert type is found
if (fI != null) {
fI.Activate();
fI.SwitchTab(tab);
return;
}
}
您必须这样说:
((Insert)f).SwitchTab(tab)
这将尝试将表单转换为它,但是如果没有抛出异常。 但是,既然您检查了它,就不会有问题:-)
使用linq,您可以执行以下操作:
private void OpenInsert(int tab)
{
var insert = Application.OpenForms.OfType<Insert>().FirstOrDefault();
if (insert == null)
{
insert = new Insert(tab);
insert.Show();
}
else
{
insert.Activate();
insert.SwitchTab(tab);
}
}
var form = Application.OpenForms.OfType<Insert>().FirstOfDefault();
if(form != null) {
form.Activate();
form.SwitchTab(tab);
} else {
form = new Insert(tab);
insert.Show();
}//if
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.