我在WinForms应用程序中使用MVP监督演示者模式。我有一个TabControl
和一些TabPage
的视图。我需要延迟加载所选的每个标签页的内容,因为在尝试填充整个视图时会有明显的延迟。
我希望能够挂钩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());
}
}
答案 0 :(得分:1)
您可以为要添加的每个TabItem创建TabItem的子类,并在每个TabItem上实现.Load()方法。除了子类化或一些过于复杂的字典/委托解决方案,我认为你不会避免某种形式的流控制。 Switch是最合适的流量控制形式。
我会找到比索引更好的东西来打开 - 某种标签ID或名称。如果稍后重新排列选项卡,则不希望重写此代码。
答案 1 :(得分:0)
您可以使用Enter Event。在Properties |中选择TabPage设计器中的事件列表可以设置Enter事件/或者您可以以编程方式设置事件。每次TabPage获得焦点时都会触发输入...
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");
}