我有一个 Windows 窗体应用程序。我在这个应用程序中有多个表单(一个主表单和几个专用表单),并且只有一个表单没有为我的任何按钮触发点击事件。
并不是处理程序中的代码被破坏了。这可以通过单击按钮时从未到达处理程序第一行上的断点这一事实来确定。
其他事件正在运行(我在此表单上使用 CheckedChanged
事件并且它们正在运行)。
我的团队成员已经审查过,也没有发现问题。
这是我的代码的简化 View :
设计器生成的代码
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");
}
}
编辑:来自测试的附加信息
我的表单中有几个数据绑定(bind)下拉列表。我发现只有在我先在下拉框中进行选择时,点击事件才会触发。
如果我不做任何选择,按钮处理程序中的断点将触发。否则它不会。这些下拉列表中没有注册任何事件。
最佳答案
原因如下:
使用数据绑定(bind)时,当您在数据绑定(bind)控件中输入一个值时,它首先尝试验证输入,然后如果输入有效,数据绑定(bind)会将值放入数据源,但如果发生验证错误,则验证返回 false 并且您的控件进入无效模式。
当表单的子控件未通过验证时,默认情况下您无法从无效控件更改焦点。
默认情况下,单击按钮会导致验证失去焦点的控件,因此您无法单击按钮,因为您看到按钮反射(reflect)到鼠标但实际上并未单击。
如果您处理TextBox
等控件的Validating
事件并设置e.cancel = true
,也会发生同样的问题。
修复方法如下:
您可以使用以下任一选项修复此行为:
- 设置
CausesValidation
将按钮的属性设置为false
- 设置
AutoValidate
将表单的属性设置为AutoValidate.EnableAllowFocusChange
关于c# - 单击事件未触发 - 无法更改焦点 - 无法关闭表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33162003/