点击事件不触发-不能改变焦点-不能关闭窗体
本文关键字:不能 焦点 窗体 能改变 事件 | 更新日期: 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();
}
我在进一步测试后发现了这个问题。
问题不在于按钮事件,而在于从下拉框中进行选择后表单被阻塞。
我还没有发现为什么表单块后下拉被选中(它没有事件,但确实有数据绑定,所以有一些可能的原因)。
谢谢你的帮助!