点击事件不触发-不能改变焦点-不能关闭窗体

本文关键字:不能 焦点 窗体 能改变 事件 | 更新日期: 2023-09-27 18:17:53

我有一个Windows窗体应用程序。这个应用程序中有几个表单(一个主表单和几个专用表单),只有一个表单的任何按钮都没有触发单击事件。

这并不是说处理程序中的代码有问题。这可以通过以下事实来确定:当单击该按钮时,永远不会到达处理程序第一行的断点。

其他事件正在工作(我在此表单上使用CheckedChanged事件并且它们正在行为)。

我的团队成员已经检查过了,但也没有发现问题。

下面是我的代码的简化视图:

设计器生成的代码

partial class MyForm
{
    private System.Windows.Forms.Button addButton;
    private void InitalizeComponent()
    {
        this.addButton = new System.Windows.Forms.Button();
        this.addButton.Name = "addButton";
        // Drawing statements here
        this.addButton.Click += new System.EventHandler(this.addButton_Click);
        this.Controls.Add(this.addButton);
    }
}

我的代码

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }
    private void addButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show("The debugger is not reaching a break point on this line");
    }
}

编辑:来自测试的附加信息

在我的表单中有几个数据绑定的下拉列表。我发现,只有当我先在下拉框中进行选择时,click事件才不会触发。

如果没有选择,则触发按钮处理程序中的断点。否则就不会。这些下拉列表中没有注册事件

点击事件不触发-不能改变焦点-不能关闭窗体

这是原因:

使用数据绑定时,当您在数据绑定控件中输入值时,它首先尝试验证条目,然后如果条目有效,数据绑定将把该值放在数据源中,但如果发生验证错误,验证返回false并且您的控件进入无效模式。

当窗体的子控件没有验证时,默认情况下你不能从无效控件更改焦点。

默认情况下,单击按钮会导致控件验证失去焦点,因此您无法单击按钮,因为您看到按钮反射到鼠标而不是实际单击。

如果您处理TextBox等控件的Validating事件并设置e.cancel = true,则会发生相同的问题。

修复:

您可以使用以下选项之一修复此行为:

  • 设置按钮的CausesValidation属性为false
  • 设置窗体的AutoValidate属性为AutoValidate.EnableAllowFocusChange

这就可以了

改变
public ScheduleMeeting()
{
    InitializeComponent();
} 

public MyForm()
{
    InitializeComponent();
}

我在进一步测试后发现了这个问题。

问题不在于按钮事件,而在于从下拉框中进行选择后表单被阻塞。

我还没有发现为什么表单块后下拉被选中(它没有事件,但确实有数据绑定,所以有一些可能的原因)。

谢谢你的帮助!