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