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

オブジェクトをクラスにキャストできない場合は、asreturnsを使用してキャストします。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

あなたはそれがそうだと言わなければならないでしょう:

((Insert)f).SwitchTab(tab)

これはフォームをそれにキャストしようとしますが、そうでない場合は例外をスローします。しかし、あなたがそれをチェックするので、問題はないはずです:-)

于 2012-11-05T08:00:39.507 に答える
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 に答える