1

我检查了一个表格是否已经打开。如果不是,它将打开,如果是,它将激活表单 + 使用 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 类,但它只有在它是时才通过。那么有什么方法可以强制让它知道它是插入的一个实例吗?

4

4 回答 4

2

如果无法将对象强制转换为类,则使用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;
        }
    }
于 2012-11-05T08:03:42.243 回答
1

使用 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);
    }
}
于 2012-11-05T08:16:48.813 回答
1
var form = Application.OpenForms.OfType<Insert>().FirstOfDefault();
if(form != null) {
  form.Activate();
  form.SwitchTab(tab);
} else {
  form = new Insert(tab);
  insert.Show();
}//if
于 2012-11-05T08:17:22.830 回答
1

你必须告诉它是这样的:

((Insert)f).SwitchTab(tab)

这将尝试将表单转换为它,但如果不是,则会抛出异常。但是既然你检查了它,应该没有问题:-)

于 2012-11-05T08:00:39.507 回答