2010-01-21 93 views
3

我有一个标签控件和3个标签页。 (C#)Tabpage控件离开

如果我在标签2中,并编辑文本框的值 ,然后单击标签3,我需要验证在文本框中输入的内容。 如果正确我应该允许切换到标签3否则应该保留在标签2它自我 我如何实现这一目标?

IAM curently处理“离开”事件tabpage2的, 我验证文本框中的值有如果发现无效 我设置为tabcontrol.Selectedtab = tabpage2;这确实是 ,但切换到新选项卡!我怎么能限制导航。

我是C#的新手,所以可能是我正在处理错误的事件!

下面是相关代码:

private void tabpage2_Leave(object sender, EventArgs e) 
{ 
    if (Validatetabpage2() == -1) 
    { 
     this.tabcontrol.SelectedTab =this.tabpage2; 
    } 
} 
+1

您可以发布您的代码的相关部分? – 2010-01-21 03:49:08

+0

private void tabpage2_Leave(object sender,EventArgs e) if(Validatetabpage2()== -1) { this.tabcontrol.SelectedTab = this.tabpage2; } } – Maneesh 2010-01-21 04:20:07

+0

这里有一个相当体面和相关的讨论:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/39939f09-229a-45d1-ad3d-5c39ce9bd0ba/ – 2010-01-21 04:41:20

回答

1

您可以使用TabControl的选择事件取消切换页面。在事件中将e.Cancel设置为true将停止tabcontrol选择不同的选项卡。

private bool _cancelLeaving = false; 

private void tabpage2_Leave(object sender, EventArgs e) 
{ 
    _cancelLeaving = Validatetabpage2() == -1; 
} 

private void tabcontrol_Selecting(object sender, TabControlCancelEventArgs e) 
{ 
    e.Cancel = _cancelLeaving; 
    _cancelLeaving = false; 
} 
+0

看起来像一个体面的方法,只要Leave事件在选择事件之前触发。 – 2010-01-21 05:20:50

+0

只是不要使用Leave事件。在选择事件中进行验证足够好。 – 2010-01-21 18:09:42

1

虽然其他方法可能有效,但验证事件是专门为此设计的。

这是它的工作原理。当选项卡控件的SelectedIndex更改时,将焦点设置为新选择的页面以及CausesValidation = true。这确保了如果用户尝试以任何方式离开选项卡,就会调用Validating事件。

然后在页面特定的验证事件中进行常规验证,并在需要时取消。

您需要确保在Form Shown事件(Form_Load不起作用)中设置初始选定的选项卡页面,并且连接标签页特定的验证事件。

下面是一个例子:

private void Form_Shown(object sender, System.EventArgs e) 
{ 
    // Focus on the first tab page 
    tabControl1.TabPages[0].Focus(); 
    tabControl1.TabPages[0].CausesValidation = true; 

    tabControl1.TabPages[0].Validating += new CancelEventHandler(Page1_Validating); 
    tabControl1.TabPages[1].Validating += new CancelEventHandler(Page2_Validating); 
} 

    void Page1_Validating(object sender, CancelEventArgs e) 
    { 
     if (textBox1.Text == "") 
     { 
      e.Cancel = true; 
     } 
    } 

    void Page2_Validating(object sender, CancelEventArgs e) 
    { 
     if (checkBox1.Checked == false) 
     { 
      e.Cancel = true; 
     } 
    } 

private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
    // Whenever the current tab page changes 
    tabControl1.TabPages[tabControl1.SelectedIndex].Focus(); 
    tabControl1.TabPages[tabControl1.SelectedIndex].CausesValidation = true; 
}