按钮单击事件C#

时间:2012-06-08 14:49:48

标签: c# methods

所以我有一个带有几个字段的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.
    }
    // ...
}

5 个答案:

答案 0 :(得分:2)

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

所以在Enter上点击你想要

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

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

希望这有帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的代码存在很多问题。在ex!=null中显示MessageBox之后,为什么要检查validate()?使用goto标签在C#中并不标准。

嵌套的尝试也不好。分离你的代码,因为有一个单独的功能,只需要验证数据。您的按钮单击处理程序不应该执行所有这些工作。因此,您将拥有一个clearForm()函数来处理验证逻辑和if (validate()) //save to db else clearForm()

这基本上解决了按钮点击处理程序中的所有混乱,它只需要按照以下方式执行操作:

{{1}}

另外你应该重新考虑你的设计,如果确实需要,函数应该只抛出异常。您是否需要抛出异常,因为一个表单输入的格式不正确?

答案 3 :(得分:0)

放下goto。并让用户修复错误的条目。当他完成后,他会再次点击按钮。如果你去restart:,你可能会陷入无休止的循环中。

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

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

答案 4 :(得分:0)

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

来源:

how to keep a control disabled till a thread ends

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