3

我有一个标签控件和 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; 
    } 
}
4

2 回答 2

2

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

这是它的工作原理。When the SelectedIndex of the tab control changes, set the focus to the newly selected page and as well as 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; 
}
于 2010-01-21T14:40:19.427 回答
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;
}
于 2010-01-21T05:06:53.053 回答