0

WinFormsアプリケーションでプレゼンターパターンを監視するMVPを使用しています。TabControlといくつかのTabPagesを持つビューがあります。ビュー全体にデータを入力しようとすると顕著な遅延が発生するため、選択した各タブページのコンテンツを遅延ロードする必要があります。

TabPage.GotFocusイベントにフックして、特定のタブが選択されたときにハンドラーを提供したいと思っていましたが、それは機能していないようです。TabControl.SelectedIndexChangedそのため、これを機能させるには、イベントとswitchステートメントを使用する必要がありました。switchステートメントを入れなければならないのは本当に苦痛です。switchステートメントを回避する方法はありますか?

public partial class Form1 : Form
{
    public event EventHandler TabPage1Selected;

    public event EventHandler TabPage2Selected;

    public event EventHandler TabPage3Selected;


    public Form1()
    {
        InitializeComponent();
        this.tabControl1.SelectedIndexChanged += tabControl1_SelectedIndexChanged;

        this.tabPage1.GotFocus += tabPage1_GotFocus; //Doesn't work!
    }

    private void tabPage1_GotFocus(object sender, EventArgs e)
    {
        Debug.WriteLine("event fired for tabpage1");
    }

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Debug.WriteLine("Raising tab selected event");
        EventHandler h = null;
        switch (this.tabControl1.SelectedIndex)
        {
            case 0:
                h = this.TabPage1Selected;
                break;
            case 1:
                h = this.TabPage2Selected;
                break;
            case 2:
                h = this.TabPage3Selected;
                break;
            default:
                break;
        }
        if (h != null) h(this, new EventArgs());
    }    
}
4

2 に答える 2

1

追加するTabItemごとにTabItemをサブクラス化し、それぞれに.Load()メソッドを実装できます。サブクラス化または過度に複雑な辞書/デリゲートソリューションを除けば、何らかの形のフロー制御を回避することはできないと思います。ここでは、スイッチがフロー制御の最も適切な形式です。

スイッチをオンにするには、インデックスよりも優れたものを見つけることを検討します-ある種のタブIDまたは名前。後でタブを再配置する場合は、このコードを書き直す必要はありません。

于 2013-02-25T03:22:56.403 に答える
0

Enterイベントを使用できます。プロパティ|でTabPageを選択します デザイナのイベントリストでは、Enterイベントを設定するか、プログラムでイベントを設定できます。TabPageがフォーカスを取得するたびにEnterが起動します…

public Form1()
{
    InitializeComponent();

    // I set tabPage1 & 2 event w/ the designer
    tabPage3.Enter += tabPage3_Enter;
}

private void tabPage1_Enter(object sender, EventArgs e)
{
    Debug.WriteLine("tabPage1_Enter");
}

private void tabPage2_Enter(object sender, EventArgs e)
{
    Debug.WriteLine("tabPage2_Enter");
}

private void tabPage3_Enter(object sender, EventArgs e)
{
    Debug.WriteLine("tabPage3_Enter");
}
于 2013-02-25T05:07:54.047 に答える