源码——WinForm窗体一次性数据合法性验证

正则表达式都在程序里,呵呵……




using System;
using System.Data;
using System.Windows.Forms;


namespace HEWin.Sys
{
    
/// <summary>
    
/// 功能:验证DataTable、DataRow和DataForm数据的合法性
    
/// 原理:使用DataColoum的扩展属性和窗口控件的Tag属性,存放数据的规范,调用本类来验证输入数据的合法性.
    
/// </summary>

    public class sysValidate: IDisposable
    
{
        
private HEWin.Sys.sysErrors _Errors=new sysErrors();
        
private System.Windows.Forms.Control _FocusControl;
        
static  private string UnString=@"\\'";
        
static  private System.Text.RegularExpressions.Regex  _CHAR=new System.Text.RegularExpressions.Regex("["+UnString+"]");
        
        
public     void  Dispose()
        
{
         _Errors.Dispose();

        }

        
public      sysValidate()   
        
{
        }

        
/// <summary>
        
/// 功能:判断一个窗体上所有控件的数据合法性
        
/// 原理:根据控件的Tag属性存放的数据规范来验证数据的合法性,
        
///      将错误返回到错误对象集合里.
        
/// </summary>
        
/// <param name="frm">窗口的引用</param>
        
/// <returns>错误集合对象</returns>

        public Sys.sysErrors validateForm(System.Windows.Forms.Form frm)
        
{
            
this._FocusControl=null;
            
if(_Errors!=null) _Errors.Dispose();
            _Errors    
=new HEWin.Sys.sysErrors();
            
foreach(System.Windows.Forms.Control ctl in frm.Controls)
                _Errors.MergeErrors(validateControl(ctl));
            
if(this._FocusControl!=null)
                
this._FocusControl.Focus();
            
return _Errors;
        }


        
/// <summary>
        
/// 功能:判断一个窗体上可见控件的数据合法性
        
/// 原理:根据控件的Tag属性存放的数据规范来验证数据的合法性,
        
///      将错误返回到错误对象集合里.
        
/// </summary>
        
/// <param name="frm">窗口的引用</param>
        
/// <param name="Visible">true:表示对可见控件进行判断</param>
        
/// <returns>错误集合对象</returns>

        public Sys.sysErrors validateForm(System.Windows.Forms.Form frm,bool Enabled)
        
{
            
this._FocusControl=null;
            
if(_Errors!=null) _Errors.Dispose();
            _Errors    
=new HEWin.Sys.sysErrors();
            
foreach(System.Windows.Forms.Control ctl in frm.Controls)
                _Errors.MergeErrors(validateControl(ctl,Enabled));
            
if(this._FocusControl!=null)
                
this._FocusControl.Focus();
            
return _Errors;
        }

        
/// <summary>
        
/// 功能:判断一个控件的数据合法性
        
/// 原理:根据控件的Tag属性存放的数据规范来验证数据的合法性,
        
///      将错误返回到错误对象集合里.
        
/// </summary>
        
/// <param name="ctl">控件的引用</param>
        
/// <returns>错误集合对象</returns>

        public Sys.sysErrors validateControl(System.Windows.Forms.Control ctl)
        
{
            HEWin.Sys.sysErrors errs    
= new HEWin.Sys.sysErrors();
            
            
switch (ctl.GetType().ToString())
            
{
                
case "System.Windows.Forms.GroupBox" :
                    
foreach(System.Windows.Forms.Control ctlInner in ctl.Controls)
                        errs.MergeErrors(validateControl(ctlInner));        
//递归
                    break;
                
case "System.Windows.Forms.Panel" :
                    
foreach(System.Windows.Forms.Control ctlInner in ctl.Controls)
                        errs.MergeErrors(validateControl(ctlInner));        
//递归
                    break;
                
default :
                    Sys.sysError err 
= validate(ctl);
                    
if (err != null)
                    
{
                        
if (this._FocusControl==null && ctl.Visible)
                            
this._FocusControl=ctl;
                        
if(this._FocusControl!=null && ctl.TabIndex<this._FocusControl.TabIndex && ctl.Visible)
                            
this._FocusControl=ctl;
                        errs.AddError(err);
                    }

                    
break;
            }

            
return errs;
        }

    
        
/// <summary>
        
/// 功能:判断一个可见控件的数据合法性
        
/// 原理:根据控件的Tag属性存放的数据规范来验证数据的合法性,
        
///      将错误返回到错误对象集合里.
        
/// </summary>
        
/// <param name="ctl">控件的引用</param>
        
/// <param name="Visible">true:表示对可见控件进行判断</param>
        
/// <returns>错误集合对象</returns>

        public Sys.sysErrors validateControl(System.Windows.Forms.Control ctl,bool Enabled)
        
{

            HEWin.Sys.sysErrors errs    
= new HEWin.Sys.sysErrors();
            
            
switch (ctl.GetType().ToString())
            
{
                
case "System.Windows.Forms.GroupBox" :
                    
foreach(System.Windows.Forms.Control ctlInner in ctl.Controls)
                        errs.MergeErrors(validateControl(ctlInner,Enabled));        
//递归
                    break;
                
case "System.Windows.Forms.Panel" :
                    
foreach(System.Windows.Forms.Control ctlInner in ctl.Controls)
                        errs.MergeErrors(validateControl(ctlInner,Enabled));        
//递归
                    break;
                
default :
                    
if (ctl.Visible!=Enabled)  
                        
return errs;
                    
                    
if(ctl is System.Windows.Forms.TextBox&&( ((TextBox)ctl).ReadOnly==Enabled))
                        
return errs;

                    Sys.sysError err 
= validate(ctl);
                    
if (err != null)
                    
{
                        
if (this._FocusControl==null && ctl.Visible)
                            
this._FocusControl=ctl;
                        
if(this._FocusControl!=null && ctl.TabIndex<this._FocusControl.TabIndex && ctl.Visible)
                            
this._FocusControl=ctl;
                        errs.AddError(err);
                    }

                    
break;
            }

            
return errs;
        }

    
        
/// <summary>
        
/// 功能:判断一个控件数据的合法性
        
/// 原理:根据控件的Tag属性存放的数据规范来验证数据的合法性,所有验证控件的函数都是调用此函数来执行验证的.
        
/// </summary>
        
/// <param name="ctl">控件的引用</param>
        
/// <returns>返回错误集合对象</returns>

        private Sys.sysError validate(System.Windows.Forms.Control ctl)
        
{
            
            
            
if (ctl.Tag != null && ctl.Tag.ToString() != "0;")
            
{
                
string strTag = ctl.Tag.ToString();
                
string strText = ctl.Text;

                
if (strTag.IndexOf(";"== -1)
                    
return null;

                
string strVid = "";
                System.Text.RegularExpressions.Regex regex;
                
if (strTag.Length >= 1)
                    strVid 
= strTag.Substring(0,1);
                
else
                    
return null;
                
string strVname = "";
                
string strVmaxmin = "";
                
string strFill = "0";

                Sys.sysError _Error 
= new Sys.sysError();

                
switch (strVid)
                
{
                    
case "1" :
                        
try
                        
{
                            regex 
= new System.Text.RegularExpressions.Regex
                                (
@"^\d+;(?<vname>[\u4E00-\u9FA0]+);(?<vfill>\d+);(?<vmaxmin>\d+,\d+);(?<vfraction>\d+);");    //匹配数字验证的正则表达式

                            strVname 
= regex.Match(strTag).Result("${vname}");
                            strFill 
= regex.Match(strTag).Result("${vfill}");
                            strVmaxmin 
= regex.Match(strTag).Result("${vmaxmin}");
                            
int intFraction = Convert.ToInt32(regex.Match(strTag).Result("${vfraction}"));

                            
if (strFill == "1")
                            
{
                                
if (strText == "")                                            //是否必填
                                {
                                    _Error 
= new HEWin.Sys.sysError(-1,strVname,1001,"不能为空!");                // D(1) = B(00000001)
                                    return _Error;
                                }

                            }

                            
else
                            
{
                                
if (strText == "")
                                    
return null;
                            }



                            regex 
= new System.Text.RegularExpressions.Regex(@"^\d*\.?\d+$");        //是否有非法字符(此处必须全部为数字)
                            if (strText != ""&&(!regex.IsMatch(strText)||strText.Substring(0,1)=="."))
                            
{
                                _Error 
= new HEWin.Sys.sysError(-1,strVname,1002,"必须为数字!");                                        // D(16) = B(00010000)
                                return _Error;
                            }


                            
try
                            
{
                                System.Decimal test
=System.Convert.ToDecimal(strText);
                            }

                            
catch
                            
{
                                _Error 
= new HEWin.Sys.sysError(-1,strVname,1002,"必须为数字!");                                        // D(16) = B(00010000)
                                return _Error    ;
                            }

                        


                            regex 
= new System.Text.RegularExpressions.Regex(@"^(?<vmin>\d+),(?<vmax>\d+)",
                                System.Text.RegularExpressions.RegexOptions.Compiled);


                            
//要判断非常大的数据吗??

                            
long lngMax = 0;
                            
long lngMin = 0;
                        
                            
try
                            
{
                                lngMax 
= Convert.ToInt64(regex.Match(strVmaxmin).Result("${vmax}"));
                                lngMin 
= Convert.ToInt64(regex.Match(strVmaxmin).Result("${vmin}"));

                                
if (strText == "0")
                                
{
                                    _Error 
= new sysError(-1,strVname,1003,"不能为0!");
                                    
return _Error;                        //非0判断
                                }


                                
if (System.Math.Ceiling(Convert.ToDouble(strText)) > lngMax)        //最大值判断
                                    if (System.Math.Floor(Convert.ToDouble(strText)) != lngMax)
                                    
{
                                        _Error 
= new sysError(-1,strVname,1004,"最大值超出范围!");                                                // D(2) = B(00000010)
                                        return _Error;
                                    }


                                
if (System.Math.Ceiling(Convert.ToDouble(strText)) < lngMin)                            //最小值判断
                                {
                                    _Error 
= new sysError(-1,strVname,1005,"最小值超出范围!");                                                // D(4) = B(00000100)
                                    return _Error;
                                }

                            }

                            
catch
                            
{
                                _Error 
= new sysError(-1,strVname,1006,"所填数据过大!");                                            //所填数据过大
                                return _Error;
                            }


                            
if (strText.IndexOf("."!= -1)
                            
{
                                regex 
= new System.Text.RegularExpressions.Regex(@"^\d+\.(?<vfraction>\d+$)");
                                
if (regex.Match(strText).Result("${vfraction}").Length > intFraction)    //小数位数判断
                                {
                                    _Error 
= new sysError(-1,strVname,1007,"小数位数过长!");                                                        // D(8) = B(00001000)                        
                                    return _Error;
                                }

                                
                            }

                        }

                        
catch
                        
{
                            _Error 
= new sysError(-1,strVname,1499,"判断条件出错!");                //判断条件出错
                            return _Error;
                        }

                        
break;
                    
case "2" :
                        
try
                        
{
                            
//检查控件的Tag属性设置是否正确
                            regex = new System.Text.RegularExpressions.Regex
                                (
@"^\d+;(?<vname>[\u4E00-\u9FA0]+);(?<vfill>\d+);(?<vmaxmin>\d+,\d+);");
                        
                            strVname 
= regex.Match(strTag).Result("${vname}");
                            strFill 
= regex.Match(strTag).Result("${vfill}");
                            strVmaxmin 
= regex.Match(strTag).Result("${vmaxmin}");

                            
//判断是否必填
                            if (strFill == "1")
                            
{
                                
if (strText == "")
                                
{
                                    _Error 
= new sysError(-1,strVname,1001,"不能为空!");
                                    
return _Error;
                                }

                            }


                            
//判断是否有非法字符
                            if (_CHAR.IsMatch(strText) && strText != "")    
                            
{
                                _Error 
= new sysError(-1,strVname,1008,"存在“"+UnString+"“等非法字符!");
                                
return _Error;
                            }



                            
if (_CHAR.IsMatch(strText) && strText != "")    
                            
{
                                _Error 
= new sysError(-1,strVname,1008,"存在“"+UnString+"”等非法字符!");
                                
return _Error;
                            }



                            
//判断字符最大最小长度
                            
//HEWin.Sys.sysFunction.MsgWarning(strVmaxmin);
                            regex = new System.Text.RegularExpressions.Regex(@"^(?<vmin>\d+),(?<vmax>\d+)");
                            
int intMax = Convert.ToInt32(regex.Match(strVmaxmin).Result("${vmax}"));
                            
int intMin = Convert.ToInt32(regex.Match(strVmaxmin).Result("${vmin}"));
                            
//最大字符长度
                            if (strText.Length > intMax)
                            
{
                                _Error 
= new sysError(-1,strVname,1009,"所填字符太长!");
                                
return _Error;
                            }

                                
//最小长度
                            else if (strText.Length < intMin)
                            
{
                                _Error 
= new sysError(-1,strVname,1010,"所填字符太短!");
                                
return _Error;                                                                
                            }


                        }

                        
catch
                        
{
                            _Error 
= new sysError(-1,strVname,1499,"判断条件出错!");                //判断条件出错
                            return _Error;
                        }

                                        
                        
break;

                    
case "3" :
                        
try
                        
{
                            regex 
= new System.Text.RegularExpressions.Regex
                                (
@"^\d+;(?<vname>[\u4E00-\u9FA0]+);(?<vfill>\d+);(?<vmaxmin>\d{4}\-\d{1,2}\-\d{1,2},\d{4}\-\d{1,2}\-\d{1,2});",
                                System.Text.RegularExpressions.RegexOptions.Compiled);
                            
//DateTimePicker控件
                            if (ctl.GetType().ToString() == "System.Windows.Forms.DateTimePicker")
                                strText 
= ((System.Windows.Forms.DateTimePicker)ctl).Value.ToString("yyyy-MM-dd");

                            strVname 
= regex.Match(strTag).Result("${vname}");
                            strFill 
= regex.Match(strTag).Result("${vfill}");
                            strVmaxmin 
= regex.Match(strTag).Result("${vmaxmin}");


                            
//是否必填
                            if (strFill == "1")
                            
{
                                
if (strText == "")
                                
{
                                    _Error 
= new sysError(-1,strVname,1001,"不能为空!");                //判断条件出错
                                    return _Error;
                                }

                            }


                            
//最大最小日期
                            regex = new System.Text.RegularExpressions.Regex(@"^(?<vmin>\d{4}\-\d{1,2}\-\d{1,2}),(?<vmax>\d{4}\-\d{1,2}\-\d{1,2})");
                            
//最大日期

                            
try
                            
{
                                
if (Convert.ToDateTime(strText) > Convert.ToDateTime(regex.Match(strVmaxmin).Result("${vmax}")))
                                
{
                                    _Error 
= new sysError(-1,strVname,1011,"所填日期太大!");                
                                    
return _Error;
                                }

                                    
//最小日期
                                else if (Convert.ToDateTime(strText) < Convert.ToDateTime(regex.Match(strVmaxmin).Result("${vmin}")))
                                
{
                                    _Error 
= new sysError(-1,strVname,1011,"所填日期太小!");    
                                    
return _Error;
                                }

                            }

                            
catch
                            
{
                                _Error 
= new sysError(-1,strVname,1012,"不是类似“yyyy-MM-dd“格式的日期!");
                                
return _Error;
                            }


                        }

                        
catch
                        
{
                            _Error 
= new sysError(-1,strVname,1499,"判断条件出错!");                //判断条件出错
                            return _Error;
                        }


                        
break;

                    
default :
                        _Error 
= new sysError(-1,ctl.Name,1498,"Tag判断条件无法解析!");
                        
return _Error;
                }
            
            }

            
            
return null;
        }

    }

}

posted @ 2005-04-04 21:56  蜡人张  阅读(3353)  评论(4编辑  收藏  举报