选项卡控件离开事件

3
我有一个选项卡控件,里面有3个选项卡页。(C#)
如果我在选项卡2中编辑文本框的值,然后单击选项卡3,我需要验证文本框中输入的内容。如果正确,应允许切换到选项卡3,否则应该保持在选项卡2中。我应该如何实现这一点?
目前我正在处理选项卡页2的“离开”事件,在那里我验证文本框的值,如果发现无效,我设置为tabcontrol.Selectedtab = tabpage2; 这样做了验证但是会切换到新的选项卡!如何限制导航。
我是C#初学者,所以可能我在处理错误的事件!
下面是相关代码:
private void tabpage2_Leave(object sender, EventArgs e) 
{ 
    if (Validatetabpage2() == -1) 
    { 
        this.tabcontrol.SelectedTab =this.tabpage2; 
    } 
}

1
你能发布你代码的相关部分吗? - Robert Harvey
私有的 void tabpage2_Leave(object sender, EventArgs e) { if (Validatetabpage2() == -1) { this.tabcontrol.SelectedTab =this.tabpage2; } } - Maneesh
这里有一个相当不错且相关的讨论:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/39939f09-229a-45d1-ad3d-5c39ce9bd0ba/ - Robert Harvey
2个回答

2
虽然其他方法也可以工作,但是验证事件是专门设计用于这个的。当选项卡控件的 SelectedIndex 更改时,将焦点设置为新选择的页面,并将 CausesValidation 设置为 true。这会确保在用户尝试以任何方式离开标签时调用验证事件。然后在特定于页面的验证事件中进行常规验证,并根据需要取消。您需要确保在表单显示事件中设置初始选定的选项卡页(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; 
}

1
您可以使用TabControl的Selecting事件来取消切换页面。在该事件中将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;
}

那看起来是个不错的方法,只要 Leave 事件在 Selecting 事件之前触发。 - Robert Harvey
1
只需不使用Leave事件。在Selecting事件中进行验证就足够了。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接