Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按钮点击事件C#_C#_Methods - Fatal编程技术网

按钮点击事件C#

按钮点击事件C#,c#,methods,C#,Methods,因此,我有一个Windows窗体,其中有几个字段可以接受数据并写入SQL数据库。我的按钮单击事件处理除验证用户输入之外的所有工作。这些都是通过不同的方法处理的。我的问题是,如果用户的输入不正确,我如何在显示messagebox后重置表单?也许只是使用按钮点击事件来启动一个单独的方法,这样我可以更好地控制它 private void enter_button_Click(object sender, EventArgs e) { restart: try { try

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

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.
    }
    // ...
}

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

所以,按一下你想要的

if(!ValidateForm())
{
   MessageBox.Show("Invalid Form");
   ClearForm();
   return;
}
SaveForm();
我强烈建议不要使用GOTO指令!!这是一种非常危险的做法,可能会将代码变成意大利面噩梦


希望这有帮助。

您的代码有很多问题。为什么要检查
ex=将其显示在
消息框中后为空
?使用goto标签在C#中不是标准的

if (MessageBox.Show(Exception.Message) == System.Windows.Forms.DialogResult.OK)
{
    //Clear all needed controls here
}
嵌套的尝试也不好。将代码分开一点,例如,使用一个单独的函数,只负责验证数据。您的按钮单击处理程序不必完成所有这些工作。因此,您将拥有一个负责验证逻辑的
validate()
函数和一个
clearForm()

这将从根本上解决按钮点击处理程序中的所有混乱问题,它只需按照以下方式进行操作:

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

此外,您还应该重新考虑您的设计,函数应该只在确实需要时抛出异常。由于一个表单输入的格式无效,是否需要引发异常?

只需将
转到
即可。并让用户修复错误的条目。完成后,他将再次单击按钮。如果您转到
重新启动:
,您可能会陷入无休止的循环

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


顺便说一下,使用
goto
真的很难看。仅在非常罕见的情况下使用

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

资料来源:


刚刚清除所有文本框后,为什么要立即“重新启动”(重新验证)?顺便说一句,用C#这样的标签不是标准的,也很难阅读。看看计算机科学史的一部分:-)另外,你有太多的尝试。如果您的所有方法都抛出异常,那么您就有一个严重的设计缺陷。抛出异常是特殊情况,用户输入正确的细节并不是一个例外情况。我不想挑剔,但是你可能会考虑不向用户显示实际的异常消息。这会向应用程序的后端提供提示,并会向恶意用户提示攻击系统的方法。相反,记录异常,并给用户一条消息说Ooops有东西坏了。如果你登录到一个SQL表,你可以给他们LogID或你在DB中使用的任何唯一键,这样他们就可以在需要时用它打电话给你的帮助台。记住,不要使用goto。@LukeBerry:如果你想从嵌套循环中断到封闭循环的末尾,我想说使用
goto
是合法的。它与使用
return
语句相当。当然,您可以在外部循环中重复该条件或使用布尔变量,但这是否会使代码更易于理解?这确实有帮助。在编写了所有这些垃圾代码以使其正常运行之后,我认为点击事件太多了,我应该将点击事件发送给另一个函数。这个答案有点简洁,也许这会让我们了解到:如果你喜欢,请对其进行投票,或者,如果你对这个答案特别满意,勾选它,将其标记为该问题的已接受答案。