繁体   English   中英

使用(对类)未知函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM