标签控制离开

时间:2010-01-21 03:46:34

标签: c# winforms tabpage

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

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

我正在处理tabpage2的“离开”事件, 我验证那里的文本框值,如果发现无效 我设置为tabcontrol.Selectedtab = tabpage2;这样做 验证但切换到新标签!我怎么能限制导航。

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

以下是相关代码:

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

这是它的工作原理。当选项卡控件的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; 
}