Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TabControl,TabPage避免切换语句_C#_.net_Winforms - Fatal编程技术网

C# TabControl,TabPage避免切换语句

C# TabControl,TabPage避免切换语句,c#,.net,winforms,C#,.net,Winforms,我正在WinForms应用程序中使用MVP监督演示者模式。我有一个带有TabControl和许多TabPages的视图。我需要懒洋洋地加载所选页面上每个选项卡页面的内容,因为在尝试填充整个视图时存在明显的延迟 我希望挂接到TabPage.GotFocus事件中,并提供一个处理程序,用于处理选择给定选项卡但似乎不起作用的情况。因此,我必须使用选项卡control.SelectedIndexChanged事件和switch语句来实现这一点。不得不加入switch语句真是一件痛苦的事。有没有办法避免s

我正在WinForms应用程序中使用MVP监督演示者模式。我有一个带有
TabControl
和许多
TabPage
s的视图。我需要懒洋洋地加载所选页面上每个选项卡页面的内容,因为在尝试填充整个视图时存在明显的延迟

我希望挂接到TabPage.GotFocus事件中,并提供一个处理程序,用于处理选择给定选项卡但似乎不起作用的情况。因此,我必须使用
选项卡control.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());
    }    
}

您可以为要添加的每个TabItem子类化TabItem,并在每个TabItem上实现.Load()方法。除了子类化或一些过于复杂的字典/委托解决方案之外,我认为您不会避免某种形式的流控制。开关是这里最合适的流量控制形式


我会寻找比索引更好的东西来打开——某种选项卡id或名称。如果以后重新排列选项卡,则不需要重写此代码。

您可以使用Enter事件。在设计器的Properties | Events列表中选择选项卡页,您可以设置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");
}