【问题标题】:TabControl, TabPage avoid switch statementTabControl、TabPage 避免 switch 语句
【发布时间】:2013-02-25 13:24:17
【问题描述】:

我在 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());
    }    
}

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

    我会寻找比索引更好的东西来打开 - 某种标签 ID 或名称。如果您稍后重新排列选项卡,您不希望重写此代码。

    【讨论】:

      【解决方案2】:

      您可以使用 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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多