c# - 如果 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;
}
一定有更好更高效的方法吗?
解决方案
似乎您应该将其包装在一个方法中。
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:我不会说它更有效,但我相信您要求的是更清洁的方式。考虑到这一点,我强烈建议您查看一些良好的实践指南,例如鲍勃叔叔的清洁代码书或他的博客。
推荐阅读
- c++ - C++ 发布序列详细信息
- flutter - 如何去除颤动的gridView间距
- mysql - 如何将虚拟列作为常量添加到查询中
- javascript - 类型错误:this.$el.bracket 不是函数
- c++ - 在 OpenCV 中定义初始化的 3D 矩阵 Mat_ 的一个衬垫
- javascript - 如何以编程方式知道 Mongo Realm 中的错误登录?
- git - gitignore 不适用于我的后端文件夹中的 process.env
- reactjs - 反应 | Redux-Form | 字段 为字段分配状态
- aws-cli - 将 AWS 的全屏“菜单”输出更改为标准输出?
- python - 数组和列表项目