C# Windows窗体选项卡页事件

C# Windows窗体选项卡页事件,c#,winforms,button,tabpage,C#,Winforms,Button,Tabpage,我有一个windows窗体应用程序,我在其中创建了两个选项卡页。在其中一个选项卡页面中,我有一个发送电子邮件通知的按钮。 在tabpage leave事件中,我有一些代码来执行其他一些操作。 当我点击此按钮发送电子邮件时。首先触发tabpage leave事件,因为该按钮包含button1.enabled=false;在下面的第一行中 private void btnTestEmail_Click(object sender, EventArgs e) {

我有一个windows窗体应用程序,我在其中创建了两个选项卡页。在其中一个选项卡页面中,我有一个发送电子邮件通知的按钮。 在tabpage leave事件中,我有一些代码来执行其他一些操作。 当我点击此按钮发送电子邮件时。首先触发tabpage leave事件,因为该按钮包含button1.enabled=false;在下面的第一行中

 private void btnTestEmail_Click(object sender, EventArgs e)
        {
            btnTestEmail.Enabled = false;
            bool sent = Support.SendEmail("Test Email", "This is a test email, Please ignore.", null);
--
}
但是当我删除btnTestEmail.Enabled=false时;代码:它没有触发tabpage离开事件。 它触发tab page的leave事件的原因可能是什么。因为这是非常奇怪的行为。因为我不想触发任何标签页事件


关于

问题是,如果控件不是活动控件,则会触发Leave事件。如果单击该按钮,选项卡页将从活动变为非活动,因为该按钮现在是活动控件。

btnTestEmail.Enabled
更改为false将更改
ActiveControl
,从而触发
Leave
事件

根据:

使用键盘更改焦点时(TAB、SHIFT+TAB和 依此类推),通过调用Select或SelectNextControl方法,或 将ContainerControl.ActiveControl属性设置为当前 在窗体中,焦点事件按以下顺序发生:

  • 进入

  • 戈特福克斯

  • 离开

  • 验证

  • 验证

  • 失焦

  • 你能做什么:

    要消除这种行为,我要做的是取消订阅
    Leave
    事件,并在将
    Enabled
    属性设置为false后重新订阅它

    像这样:

    this.tabPage1.Leave -= new System.EventHandler(this.tabPage1_Leave);
    
    btnTestEmail.Enabled = false;
    
    this.tabPage1.Leave += new System.EventHandler(this.tabPage1_Leave);
    

    在该选项卡页面中是否有其他控件?是的,文本框下拉列表,按钮控件,复选框。在设置按钮启用之前,焦点移动到另一个控件。另一种方法通过将Enabled属性设置为false,可以强制Winforms查找另一个控件以将焦点提供给它。如果另一个控件不在选项卡页面上,那么Leave事件将触发。您需要将代码移动到一个单独的方法中,该方法既可以从Click调用,也可以从Leave事件处理程序调用。也许。