首页 > 解决方案 > 如果 C# 中的验证不正确,我如何递归调用表单?

问题描述

我在 c# 中有一个选择如下

 DialogResult validate =  MessageHelper.Show($"Could not validate,  would you like to retry ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (validate )
            {
                 case DialogResult.Yes:
                                   
                      frm1 = new FormData(objectUser1, pwd);
                      frm1.ShowDialog();
                      if (!frm1.validationResult) 
                      {
                             //do i loop here 
                      }

                        break;
                  case DialogResult.No:                     
                        return;
                        break;
                }

validationResult 位于 FormData 表单上,如果验证为 true 则设置。但是如果验证是假的,我只想给他们最多 3 次尝试。我怎样才能让它在 Yes DialogResult 中循环。

我不想这样做,

DialogResult validate = MessageHelper.Show($"无法验证,您要重试吗?", MessageBoxButtons.YesNo, MessageBoxIcon.Question); switch (validate) { case DialogResult.Yes:

                      frm1 = new FormData(objectUser1, pwd);
                      frm1.ShowDialog();
                      if (!frm1.validationResult) 
                      {
                          frm2 = new FormData(objectUser1, pwd);
                          frm2.ShowDialog();
                         
                      }
                      if (!frm2.validationResult) 
                      {
                            frm3 = new FormData(objectUser1, pwd);
                            frm3.ShowDialog();
                      }
                     if (!frm3.validationResult) 
                      {
                            MessageHelper.Show("Maximum attempts reached");
                      }

                        break;
                  case DialogResult.No:                     
                        return;
                        break;
                }

一定有更好更高效的方法吗?

标签: c#

解决方案


似乎您应该将其包装在一个方法中。

public void DisplayDialog(){
  DialogResult validate =  MessageHelper.Show($"Could not validate,  would you like to retry ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (validate )
            {
                 case DialogResult.Yes:
                                   
                      frm1 = new FormData(objectUser1, pwd);
                      frm1.ShowDialog();
                      if (!frm1.validationResult) 
                      {
                             DisplayDialog(); // the recursive part.
                      }

                        break;
                  case DialogResult.No:                     
                        return;
                        break;
                }
}

作为一般规则,即使在伪代码中也尝试写下(笔和纸)程序的流程,这将帮助您更好地了解在哪里调用什么,并且这是调整您需要的任何内容的“廉价”方式。

编辑:根据 John Wu 的评论和您的回答,我想补充一点,您可以轻松地将其包装在具有至少 2 个条件的 for 循环中,例如i< MaxRetryCount && passwordIsIncorrect而不是使用递归函数:

public void ShowValidatePasswordDialog(User, pwd){
   bool isValidPassword = false;
   bool userWantsToRetry = true;
   int maxRetryCount = 2;

   for(var i = 0; i < maxRetryCount && !isValidPassword && userWantsToRetry; i++){
     var validationForm = new FormData(objectUser1, pwd);
     validationForm.ShowDialog();
     isValidPassword = validationForm.IsValid
     if (!validationForm.IsValid) 
     {
        DialogResult retryResult =  MessageHelper.Show($"Could not validate,  would you like to retry ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        userWantsToRetry = retryResult == DialogResult.Yes
     }
     
   }
   
   // do the rest
}

编辑2:我不会说它更有效,但我相信您要求的是更清洁的方式。考虑到这一点,我强烈建议您查看一些良好的实践指南,例如鲍勃叔叔的清洁代码书或他的博客。


推荐阅读