(一)、引言
之前在园中anderslly的博客看到两篇文章:写的很好。
Windows Forms中通过自定义组件实现统一的数据验证(一)
Windows Forms中通过自定义组件实现统一的数据验证(二)

小菜在其基础上修改了代码就成了小菜在TaskVision中使用的自定义数据验证控件了。

(二)、完成效果
TaskVision自定义数据验证控件
点击登录,文本框为空的地方会显示错误提示信息。

代码下载:https://files.cnblogs.com/a-peng/SmartClient_Chapter04.rar

(三)、分析
1、不使用自定义数据验证控件,直接使用ErrorProvider

TaskVision自定义数据验证控件public partial class LoginForm : Form
}

运行:
 TaskVision自定义数据验证控件
弹出未通过验证,不过效果不太理想,界面中只有帐号文本框旁边显示了错误信息。
这是由于,ErrorProvider只验证获得焦点的控件,密码文本框还未获得焦点,所以不会提示错误。

我们可以修改btnOk_Click代码
注意下面是错误的代码:

TaskVision自定义数据验证控件private void btnOk_Click(object sender, System.EventArgs e)
}

运行:
TaskVision自定义数据验证控件
噢,我的天呐,竟然弹出通过验证!!!为什么呢?this.Validate()永远是true。不知道这是为何!!!不知道是不是bug

所以小菜妥协修改为下面的代码:

TaskVision自定义数据验证控件private void btnOk_Click(object sender, System.EventArgs e)
}

运行:
TaskVision自定义数据验证控件
现在基本满意了。不过在LoginForm代码中出现了很多与验证相关的代码,txtUserName_Validating中,txtPassword_Validating中,包括btnOk_Click中也存在与验证相关的代码。

在WinForm中,我们很经常面对如下需求,添加数据,提交,如果文本框的数量很多,那xxxx_Validating就会很多,我们完全可以将其封装成控件使用。

2、自定义数据验证控件
三个控件,一个类
BaseValidator数据验证基控件
RequiredFieldValidator验证非空控件继承BaseValidator
FormValidator窗体验证控件
ValidatorManager验证控件集合管理类,可以将验证控件与指定的窗体关联。


我们先来使用一下:
往LoginForm窗体中拉入两个自定义RequiredFieldValidator控件。
rfvUserName指定属性ControlToValidate为txtUserName,ErrorMessage为“请您输入帐号后登录”
rfvPassword指定属性ControlToValidate为txtPassword,ErrorMessage为“请您输入密码后登录”

往LoginForm窗体中拉入FormValidator控件名称fvLoginForm
在LoginForm.design.cs的相关代码如下:

TaskVision自定义数据验证控件// 
TaskVision自定义数据验证控件
// rfvUserName
TaskVision自定义数据验证控件
// 
TaskVision自定义数据验证控件
this.rfvUserName.ControlToValidate = this.txtUserName;
TaskVision自定义数据验证控件
this.rfvUserName.ErrorMessage = "请您输入帐号后登录";
TaskVision自定义数据验证控件
this.rfvUserName.IsValid = false;
TaskVision自定义数据验证控件
// 
TaskVision自定义数据验证控件
// rfvPassword
TaskVision自定义数据验证控件
// 
TaskVision自定义数据验证控件
this.rfvPassword.ControlToValidate = this.txtPassword;
TaskVision自定义数据验证控件
this.rfvPassword.ErrorMessage = "请您输入密码后登录";
TaskVision自定义数据验证控件
this.rfvPassword.IsValid = false;
TaskVision自定义数据验证控件
// 
TaskVision自定义数据验证控件
// fvLoginForm
TaskVision自定义数据验证控件
// 
TaskVision自定义数据验证控件
this.fvLoginForm.HostingForm = this;


这样我们的LoginForm代码如下:

TaskVision自定义数据验证控件public partial class LoginForm : Form
}

 

我们的代码与之前的比起来清爽了非常多。

BaseValidator控件,数据验证基控件。

TaskVision自定义数据验证控件using System;
TaskVision自定义数据验证控件
using System.Collections;
TaskVision自定义数据验证控件
using System.Collections.Generic;
TaskVision自定义数据验证控件
using System.ComponentModel;
TaskVision自定义数据验证控件
using System.Windows.Forms;
TaskVision自定义数据验证控件
TaskVision自定义数据验证控件
namespace TaskVision

RequiredFieldValidator控件判断不为空,继承BaseValidator控件。
TaskVision自定义数据验证控件using System;
TaskVision自定义数据验证控件
TaskVision自定义数据验证控件
namespace TaskVision

验证控件集合:
TaskVision自定义数据验证控件using System;
TaskVision自定义数据验证控件
using System.Collections.Generic;
TaskVision自定义数据验证控件
using System.Windows.Forms;
TaskVision自定义数据验证控件
TaskVision自定义数据验证控件
namespace TaskVision

FormValidator控件,窗体验证控件。
TaskVision自定义数据验证控件using System;
TaskVision自定义数据验证控件
using System.Collections.Generic;
TaskVision自定义数据验证控件
using System.ComponentModel;
TaskVision自定义数据验证控件
using System.ComponentModel.Design;
TaskVision自定义数据验证控件
using System.Windows.Forms;
TaskVision自定义数据验证控件
TaskVision自定义数据验证控件
namespace TaskVision

*************************************************************************
作者:a-peng
出处:
http://a-peng.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出
原文连接,否则保留追究法律责任的权利。
*************************************************************************

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-13
  • 2021-06-10
  • 2022-03-02
  • 2021-07-25
  • 2021-06-20
猜你喜欢
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
  • 2022-02-19
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案