单击事件不触发 - 无法更改焦点 - 无法关闭表单

时间:2015-10-16 03:18:08

标签: c# .net winforms data-binding

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

并不是处理程序中的代码被破坏了。这可以通过单击按钮时从未到达处理程序第一行的断点来确定。

其他事件正在发挥作用(我正在此表单上使用CheckedChanged个事件并且它们正在运行。)

我的团队成员已经审核过,也无法发现问题。

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

Designer生成的代码

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事件。

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

3 个答案:

答案 0 :(得分:8)

原因如下:

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

当表单的子控件没有验证时,默认情况下您无法从无效控件更改焦点。

默认情况下点击一个按钮会导致失去焦点的控件验证,因此您无法点击按钮,因为您看到按钮反映到鼠标但实际上没有点击。

如果您处理ALTER TABLE `administration` ADD CONSTRAINT `fk_stud3_id` FOREIGN KEY (`stud_ID`) REFERENCES `student` (`stud_ID`), ADD CONSTRAINT `fk_faculty3_ID` FOREIGN KEY (`faculty_ID`) REFERENCES `faculty` (`faculty_ID`); ADD CONSTRAINT `fk_org1_id` FOREIGN KEY (`org_ID`) REFERENCES `organization` (`org_ID`) ALTER TABLE `student_list` ADD CONSTRAINT `fk_stud4_id` FOREIGN KEY (`stud_ID`) REFERENCES `student` (`stud_ID`), ADD CONSTRAINT `fk_admin2_id` FOREIGN KEY (`admin_ID`) REFERENCES `administration` (`admin_ID`); 等控件的Validating事件并设置TextBox,则会出现同样的问题。

以下是修复:

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

  • 将按钮的e.cancel = true属性设置为CausesValidation
  • 将表单的false属性设置为AutoValidate

答案 1 :(得分:1)

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

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

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

感谢您的帮助!

答案 2 :(得分:0)

这将为您解决问题

更改

public ScheduleMeeting()
{
    InitializeComponent();
} 

public MyForm()
{
    InitializeComponent();
}