按钮单击事件 C#

本文关键字:事件 单击 按钮 | 更新日期: 2023-09-27 18:36:31

所以我有一个Windows表单,其中包含几个字段来接受数据并写入SQL数据库。我的button_click事件是处理除验证用户输入之外的所有工作。这些是通过单独的方法处理的。我的问题是,如果用户输入不正确,如何在显示消息框后重置表单?也许只是使用按钮单击事件来启动一个单独的方法,以便我可以更好地控制它?

private void enter_button_Click(object sender, EventArgs e)
{
    restart:
    try {
        try {
                Validate(fname);
                Validate(lname);
                Validate(city);
                Validate(state);
        } catch (Exception ex) {
            MessageBox.Show(ex.Message);
            if (ex != null) {
                fname.Clear();
                lname.Clear();
                city.Clear();
                state.Clear();
                goto restart;
            }
        }
        try {
            exValidate(address);
        } catch (Exception ex1) {
            MessageBox.Show(ex1.Message);
            if (ex1 != null) {
                address.Clear();
                goto restart;
            }
        }
        //blah blah...write to database.
    }
    // ...
}

按钮单击事件 C#

按钮点击的逻辑太多了。就个人而言,我宁愿验证每个领域失去的重点。如果你不想这样做,那么创建一个像bool ValidateForm()这样的方法,并将所有的验证逻辑包装在那里。如果至少一个内部验证失败,则返回 false。还要创建一个像void ClearForm()这样的方法,您可以在其中包装所有逻辑以清除所有字段。请记住,模块化代码总是好的,以便您可以重用逻辑,在这里您将清晰和验证逻辑绑定到特定事件(按钮单击)。

所以在输入点击你想要

if(!ValidateForm())
{
   MessageBox.Show("Invalid Form");
   ClearForm();
   return;
}
SaveForm();

我强烈建议根本不使用GOTO说明!!这是一种非常危险的做法,可能会将您的代码变成意大利面条的噩梦。

希望这有帮助。

我的建议是使用后台工作线程来处理逻辑,并且只让后台工作线程由button_click触发。这样,如果用户出错,您可以终止后台工作线程,并通过button_click重新启动整个过程。

来源:

如何在线程结束之前禁用控件

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

你的代码有很多问题。为什么要在MessageBox中显示后检查是否ex!=null?使用 goto 标签在 C# 中并不标准。

嵌套尝试也不好。稍微分离一下您的代码,就像有一个单独的函数来负责验证数据一样。您的按钮单击处理程序不必执行所有这些工作。因此,您将拥有一个负责验证逻辑的validate()函数和一个clearForm()

这基本上可以解决按钮单击处理程序中的所有混乱,并且只需执行以下操作

if (validate())
  //save to db
else
  clearForm()

此外,您应该重新考虑您的设计,函数应该仅在确实需要时才引发异常。是否需要因为一个表单输入格式无效而引发异常?

只需删除goto s。并让用户修复错误的条目。完成后,他将再次单击按钮。如果你去restart:你可能会陷入无休止的循环。

如果在发生错误时清除所有字段,则用户必须重新输入所有字段。只需告诉他哪些字段是错误的以及为什么,这样他就可以修复错误的条目,并且可以在修复问题时单击按钮。

顺便说一句,使用goto真的很丑陋。仅在非常非常罕见的情况下使用它!

if (MessageBox.Show(Exception.Message) == System.Windows.Forms.DialogResult.OK)
{
    //Clear all needed controls here
}