|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using ICSharpCode.Core;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using Mesnac.Controls.Base;
|
|
|
|
|
|
|
|
|
|
namespace Mesnac.Controls.Default
|
|
|
|
|
{
|
|
|
|
|
[ToolboxBitmap(typeof(System.Windows.Forms.TextBox))]
|
|
|
|
|
public partial class MCTextBox : TextBox, IBaseControl
|
|
|
|
|
{
|
|
|
|
|
#region 类型定义
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 正则表达是验证类型
|
|
|
|
|
/// </summary>
|
|
|
|
|
public enum RegexType
|
|
|
|
|
{
|
|
|
|
|
Default,
|
|
|
|
|
Number,
|
|
|
|
|
ChineseCharacters,
|
|
|
|
|
PostCode,
|
|
|
|
|
Email,
|
|
|
|
|
Tel,
|
|
|
|
|
ChinaTel,
|
|
|
|
|
Mobile,
|
|
|
|
|
Integer,
|
|
|
|
|
NegativeInteger,
|
|
|
|
|
Float,
|
|
|
|
|
NonnegativeFloat,
|
|
|
|
|
PositiveFloat,
|
|
|
|
|
NonpositiveFloat,
|
|
|
|
|
NegativeFloat,
|
|
|
|
|
EnglishCharacters,
|
|
|
|
|
UpperCaseEnglishCharacters,
|
|
|
|
|
LowerCaseEnglishCharacters,
|
|
|
|
|
NumbersAndEnglishLetters,
|
|
|
|
|
NumberOrEnglishLetterOrUnderline,
|
|
|
|
|
URL,
|
|
|
|
|
QQ,
|
|
|
|
|
SID,
|
|
|
|
|
IP,
|
|
|
|
|
DateTime,
|
|
|
|
|
Date,
|
|
|
|
|
Year,
|
|
|
|
|
Month,
|
|
|
|
|
Day,
|
|
|
|
|
Time,
|
|
|
|
|
ChineseDate
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 命令定义
|
|
|
|
|
|
|
|
|
|
private const int WM_ERASEBKGND = 0x0014;
|
|
|
|
|
private const int WM_PAINT = 0xF;
|
|
|
|
|
private const uint WM_NCPAINT = 0x0085;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 字段定义
|
|
|
|
|
|
|
|
|
|
private Color _borderColor = Color.FromArgb(107, 191, 111);
|
|
|
|
|
private string _waterMarkText;
|
|
|
|
|
private Color _waterMarkTextColor = Color.DarkGray;
|
|
|
|
|
private float _borderWeight = 1;
|
|
|
|
|
private RegexType _controlType = RegexType.Default;
|
|
|
|
|
private string _controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Default")); // "默认";
|
|
|
|
|
private int _maxValue;
|
|
|
|
|
private int _minValue;
|
|
|
|
|
private bool _isEmpty = true;//允许
|
|
|
|
|
private bool _isValid = true;//保存有效性
|
|
|
|
|
private bool _isEventValid = true; //保存事件有效性
|
|
|
|
|
private bool _mcVisible = true; //保存可见性
|
|
|
|
|
private bool _mcEnabled = true; //保存可用性
|
|
|
|
|
private Color r = Color.FromArgb(107, 191, 111);
|
|
|
|
|
private List<DesignAction> _keyDownActionList = new List<DesignAction>();
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 构造方法
|
|
|
|
|
|
|
|
|
|
public MCTextBox()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public MCTextBox(IContainer container)
|
|
|
|
|
{
|
|
|
|
|
container.Add(this);
|
|
|
|
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 事件定义
|
|
|
|
|
|
|
|
|
|
public List<DesignAction> KeyDownActionList
|
|
|
|
|
{
|
|
|
|
|
get { return _keyDownActionList; }
|
|
|
|
|
set { _keyDownActionList = value; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 属性定义
|
|
|
|
|
|
|
|
|
|
[Description("水印文字"), Category("Appearance")]
|
|
|
|
|
public string WaterMarkText
|
|
|
|
|
{
|
|
|
|
|
get { return _waterMarkText; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_waterMarkText = value;
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(typeof(Color), "DarkGray"), Description("水印文字颜色"), Category("Appearance")]
|
|
|
|
|
public Color WaterMarkTextColor
|
|
|
|
|
{
|
|
|
|
|
get { return _waterMarkTextColor; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_waterMarkTextColor = value;
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(typeof(Color), "107, 191, 111"), Description("边框颜色"), Category("Appearance")]
|
|
|
|
|
public Color BorderColor
|
|
|
|
|
{
|
|
|
|
|
get { return _borderColor; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_borderColor = value;
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(typeof(float), "1"), Description("边框粗细"), Category("Appearance")]
|
|
|
|
|
public float BorderWeight
|
|
|
|
|
{
|
|
|
|
|
get { return _borderWeight; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_borderWeight = value;
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(RegexType.Default), Description("文本框类型"), Category("Appearance")]
|
|
|
|
|
public RegexType ControlType
|
|
|
|
|
{
|
|
|
|
|
get { return _controlType; }
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_controlType = value;
|
|
|
|
|
this.ShowDescription(value);
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue("默认"), Description("控件验证描述"), Category("Behavior")]
|
|
|
|
|
public string ControlTypeText
|
|
|
|
|
{
|
|
|
|
|
get { return _controlTypeText; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(null), Description("最大值"), Category("Data")]
|
|
|
|
|
public int MaxValue
|
|
|
|
|
{
|
|
|
|
|
get { return _maxValue; }
|
|
|
|
|
set { _maxValue = value; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(null), Description("最小值"), Category("Data")]
|
|
|
|
|
public int MinValue
|
|
|
|
|
{
|
|
|
|
|
get { return _minValue; }
|
|
|
|
|
set { _minValue = value; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[DefaultValue(true), Description("验证是否通过"), Category("Behavior")]
|
|
|
|
|
public bool InvalidPass
|
|
|
|
|
{
|
|
|
|
|
get { return _isValid; }
|
|
|
|
|
}
|
|
|
|
|
[Description("是否允许为空"), Category("Behavior")]
|
|
|
|
|
public bool IsEmpty
|
|
|
|
|
{
|
|
|
|
|
get { return _isEmpty; }
|
|
|
|
|
set { _isEmpty = value; }
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 方法定义
|
|
|
|
|
|
|
|
|
|
protected override Control.ControlCollection CreateControlsInstance()
|
|
|
|
|
{
|
|
|
|
|
r = this.BorderColor;
|
|
|
|
|
this.BorderStyle = BorderStyle.FixedSingle;
|
|
|
|
|
return base.CreateControlsInstance();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 验证业务处理
|
|
|
|
|
|
|
|
|
|
private void ShowDescription(RegexType value)
|
|
|
|
|
{
|
|
|
|
|
switch (value)
|
|
|
|
|
{
|
|
|
|
|
case RegexType.Default:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Default")); //"默认";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Number:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Number")); //"数字";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChineseCharacters:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_ChineseCharacters")); //"汉字";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.PostCode:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_PostCode")); //"邮政编码";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Email:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Email")); //"电子邮件";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Tel:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Tel")); //"座机电话号码";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChinaTel:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_ChinaTel")); //"中国电话号码";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Mobile:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Mobile")); //"手机号码";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Integer:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Integer")); //"整数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NegativeInteger:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NegativeInteger")); //"负整数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Float:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Float")); //"浮点数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonnegativeFloat:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NonnegativeFloat")); //"非负浮点数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.PositiveFloat:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_PositiveFloat")); //"正浮点数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonpositiveFloat:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NonpositiveFloat")); //"非正浮点数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NegativeFloat:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NegativeFloat")); //"负浮点数";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.EnglishCharacters:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_EnglishCharacters")); //"英文字符";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.UpperCaseEnglishCharacters:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_UpperCaseEnglishCharacters")); //"大写英文字符";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.LowerCaseEnglishCharacters:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_LowerCaseEnglishCharacters")); //"小写英文字符";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NumbersAndEnglishLetters:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NumbersAndEnglishLetters")); //"数字和英文字母";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NumberOrEnglishLetterOrUnderline:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_NumberOrEnglishLetterOrUnderline")); //"数字、英文字母或下划线";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.URL:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_URL")); //"URL";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.QQ:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_QQ")); //"QQ";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.SID:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_SID")); //"身份证";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.IP:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_IP")); //"IP";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.DateTime:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_DateTime")); //"2000-2-28 23:29:59";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Date:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Date")); //"2000-2-28";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Year:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Year")); //"年份";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Month:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Month")); //"月份";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Day:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Day")); //"日";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Time:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_Time")); //"23:29:59";
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChineseDate:
|
|
|
|
|
this._controlTypeText = StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_RegexType_ChineseDate")); //"2009年2月28日";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnTextChanged(System.EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
bool b = Invalid(this.ControlType, this.Text);
|
|
|
|
|
if (!b)
|
|
|
|
|
{
|
|
|
|
|
this.BorderColor = Color.Red;
|
|
|
|
|
this.errorProvider1.SetIconAlignment((Control)this, ErrorIconAlignment.MiddleRight);
|
|
|
|
|
this.errorProvider1.SetError((Control)this, _waterMarkText == null ? _controlTypeText : _waterMarkText);
|
|
|
|
|
this._isValid = false;
|
|
|
|
|
//this.errorProvider1.Tag = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.BorderColor = r;
|
|
|
|
|
errorProvider1.SetError((Control)this, "");
|
|
|
|
|
this._isValid = true;
|
|
|
|
|
//this.errorProvider1.Tag = true;
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLostFocus(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (!this._isValid)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//WmPaint();
|
|
|
|
|
if (!_isEmpty)
|
|
|
|
|
{
|
|
|
|
|
if (this.Text == string.Empty)
|
|
|
|
|
{
|
|
|
|
|
this.BorderColor = Color.Red;
|
|
|
|
|
using (Graphics g = Graphics.FromHwnd(this.Handle))
|
|
|
|
|
{
|
|
|
|
|
using (Pen pen = new Pen(this.BorderColor, this.BorderWeight))
|
|
|
|
|
{
|
|
|
|
|
g.DrawRectangle(pen, 0, 0, Size.Width - 1, Size.Height - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this._isValid = false;
|
|
|
|
|
errorProvider1.SetIconAlignment((Control)this, ErrorIconAlignment.MiddleRight);
|
|
|
|
|
//errorProvider1.SetError((Control)this, "不允许为空!");
|
|
|
|
|
errorProvider1.SetError((Control)this, StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_errorProvider1_msg_notEmpty")));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
errorProvider1.SetIconAlignment((Control)this, ErrorIconAlignment.MiddleRight);
|
|
|
|
|
errorProvider1.SetError((Control)this, String.Empty);
|
|
|
|
|
this._isValid = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!Invalid(this.ControlType))
|
|
|
|
|
{
|
|
|
|
|
this.BorderColor = Color.Red;
|
|
|
|
|
this._isValid = false;
|
|
|
|
|
errorProvider1.SetIconAlignment((Control)this, ErrorIconAlignment.MiddleRight);
|
|
|
|
|
//errorProvider1.SetError((Control)this, "数值超出指定范围!");
|
|
|
|
|
errorProvider1.SetError((Control)this, StringParser.Parse(ResourceService.GetString("Mesnac_Controls_Default_MCTextBox_errorProvider1_msg_ExceedRange")));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.BorderColor = r;
|
|
|
|
|
this._isValid = true;
|
|
|
|
|
errorProvider1.SetError((Control)this, String.Empty);
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
}
|
|
|
|
|
base.Invalidate();
|
|
|
|
|
base.OnLostFocus(e);
|
|
|
|
|
}
|
|
|
|
|
private bool Invalid(RegexType value)
|
|
|
|
|
{
|
|
|
|
|
if (this._isEmpty && String.IsNullOrEmpty(this.Text))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
bool b = true;
|
|
|
|
|
switch (value)
|
|
|
|
|
{
|
|
|
|
|
case RegexType.Integer:
|
|
|
|
|
if (Convert.ToInt32(this._maxValue) >= Convert.ToInt32(this.Text) && Convert.ToInt32(this._minValue) <= Convert.ToInt32(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NegativeInteger:
|
|
|
|
|
if (Convert.ToInt32(this._maxValue) >= Convert.ToInt32(this.Text) && Convert.ToInt32(this._minValue) <= Convert.ToInt32(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Float:
|
|
|
|
|
if (Convert.ToDecimal(this._maxValue) >= Convert.ToDecimal(this.Text) && Convert.ToDecimal(this._minValue) <= Convert.ToDecimal(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonnegativeFloat:
|
|
|
|
|
if (Convert.ToDecimal(this._maxValue) >= Convert.ToDecimal(this.Text) && Convert.ToDecimal(this._minValue) <= Convert.ToDecimal(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.PositiveFloat:
|
|
|
|
|
if (Convert.ToDecimal(this._maxValue) >= Convert.ToDecimal(this.Text) && Convert.ToDecimal(this._minValue) <= Convert.ToDecimal(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonpositiveFloat:
|
|
|
|
|
if (Convert.ToDecimal(this._maxValue) >= Convert.ToDecimal(this.Text) && Convert.ToDecimal(this._minValue) <= Convert.ToDecimal(this.Text))
|
|
|
|
|
b = true;
|
|
|
|
|
else
|
|
|
|
|
b = false;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
private bool Invalid(RegexType value, string text)
|
|
|
|
|
{
|
|
|
|
|
if (_isEmpty)
|
|
|
|
|
{
|
|
|
|
|
if (this.Text == string.Empty)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
bool b = false;
|
|
|
|
|
switch (value)
|
|
|
|
|
{
|
|
|
|
|
case RegexType.Default:
|
|
|
|
|
b = true;
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Number:
|
|
|
|
|
b = Validation(text, @"^\d+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChineseCharacters:
|
|
|
|
|
b = Validation(text, @"^[\u4e00-\u9fa5]$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.PostCode:
|
|
|
|
|
b = Validation(text, @"^[1-9]\d{5}$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Email:
|
|
|
|
|
b = Validation(text, @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Tel:
|
|
|
|
|
b = Validation(text, @"^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChinaTel:
|
|
|
|
|
b = Validation(text, @"^\d{3}-\d{8}|\d{4}-\d{7}$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Mobile:
|
|
|
|
|
b = Validation(text, @"^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Integer:
|
|
|
|
|
b = Validation(text, @"^-?\d+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NegativeInteger:
|
|
|
|
|
b = Validation(text, @"^-[0-9]*[1-9][0-9]*$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Float:
|
|
|
|
|
b = Validation(text, @"^(-?\d+)(\.\d+)?$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonnegativeFloat:
|
|
|
|
|
b = Validation(text, @"^\d+(\.\d+)?$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.PositiveFloat:
|
|
|
|
|
b = Validation(text, @"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NonpositiveFloat:
|
|
|
|
|
b = Validation(text, @"^((-\d+(\.\d+)?)|(0+(\.0+)?))$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NegativeFloat:
|
|
|
|
|
b = Validation(text, @"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.EnglishCharacters:
|
|
|
|
|
b = Validation(text, @"^[A-Za-z]+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.UpperCaseEnglishCharacters:
|
|
|
|
|
b = Validation(text, @"^[A-Z]+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.LowerCaseEnglishCharacters:
|
|
|
|
|
b = Validation(text, @"^[a-z]+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NumbersAndEnglishLetters:
|
|
|
|
|
b = Validation(text, @"^[A-Za-z0-9]+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.NumberOrEnglishLetterOrUnderline:
|
|
|
|
|
b = Validation(text, @"^\w+$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.URL:
|
|
|
|
|
b = Validation(text, @"^(?:https?|ftp)\:\/\/(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.QQ:
|
|
|
|
|
b = Validation(text, @"^[1-9][0-9]{4,}$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.SID:
|
|
|
|
|
b = Validation(text, @"^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.IP:
|
|
|
|
|
b = Validation(text, @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.DateTime:
|
|
|
|
|
b = Validation(text, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Date:
|
|
|
|
|
b = Validation(text, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Year:
|
|
|
|
|
b = Validation(text, @"^((1[6-9]|[2-9]\d)\d{2})$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Month:
|
|
|
|
|
b = Validation(text, @"^(0?[123456789]|1[012])$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Day:
|
|
|
|
|
b = Validation(text, @"^(0?[1-9]|[12]\d|3[01])$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.Time:
|
|
|
|
|
b = Validation(text, @"^(20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$");
|
|
|
|
|
break;
|
|
|
|
|
case RegexType.ChineseDate:
|
|
|
|
|
b = Validation(text, @"^((((1[6-9]|[2-9]\d)\d{2})年(0?[13578]|1[02])月(0?[1-9]|[12]\d|3[01])日)|(((1[6-9]|[2-9]\d)\d{2})年(0?[13456789]|1[012])月(0?[1-9]|[12]\d|30)日)|(((1[6-9]|[2-9]\d)\d{2})年0?2月(0?[1-9]|1\d|2[0-8])日)|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))年0?2月29日))$");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool Validation(string validValue, string regularExpression)
|
|
|
|
|
{
|
|
|
|
|
Regex regex;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
regex = new Regex(regularExpression);
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (regex.IsMatch(validValue))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
protected override void OnPaint(PaintEventArgs pe)
|
|
|
|
|
{
|
|
|
|
|
this.BorderStyle = BorderStyle.FixedSingle;
|
|
|
|
|
|
|
|
|
|
//if (m.Msg == WM_PAINT || m.Msg == WM_NCPAINT)
|
|
|
|
|
//{
|
|
|
|
|
if (this.BorderWeight % 2 == 0)
|
|
|
|
|
{
|
|
|
|
|
this.BorderWeight -= 1;
|
|
|
|
|
}
|
|
|
|
|
using (Graphics g = Graphics.FromHwnd(this.Handle))
|
|
|
|
|
{
|
|
|
|
|
using (Pen pen = new Pen(this.BorderColor, this.BorderWeight))
|
|
|
|
|
{
|
|
|
|
|
g.DrawRectangle(pen, 0, 0, Size.Width - 1, Size.Height - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
WmPaint();
|
|
|
|
|
//}
|
|
|
|
|
base.OnPaint(pe);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void WmPaint()
|
|
|
|
|
{
|
|
|
|
|
using (Graphics graphics = Graphics.FromHwnd(base.Handle))
|
|
|
|
|
{
|
|
|
|
|
if (Text.Length == 0 && !string.IsNullOrEmpty(_waterMarkText) && !Focused)
|
|
|
|
|
{
|
|
|
|
|
TextFormatFlags format = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
|
|
|
|
|
|
|
|
|
|
if (RightToLeft == RightToLeft.Yes)
|
|
|
|
|
{
|
|
|
|
|
format |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TextRenderer.DrawText(graphics, _waterMarkText, Font, base.ClientRectangle, _waterMarkTextColor, format);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 接口成员实现
|
|
|
|
|
|
|
|
|
|
public string MCKey
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object MCValue
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.Text;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.Text = value == null ? string.Empty : value.ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IBaseControl MCRoot
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
[TypeConverter(typeof(DataSourceConverter))]
|
|
|
|
|
|
|
|
|
|
[Description("数据连接"), Category("数据")]
|
|
|
|
|
public string MCDataSourceID
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
public MCDataSource MCDataSource
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Description("是否为数据库控件"), Category("数据")]
|
|
|
|
|
public bool IsDbControl
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
[Description("初始化SQL"), Category("数据")]
|
|
|
|
|
public string InitDataSource
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
[Description("执行SQL"), Category("数据")]
|
|
|
|
|
public string ActionDataSource
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
[Description("绑定数据源"), Category("数据")]
|
|
|
|
|
public object BindDataSource
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
[Description("操作类型"), Category("数据")]
|
|
|
|
|
public DbOptionTypes DbOptionType
|
|
|
|
|
{
|
|
|
|
|
get;
|
|
|
|
|
set;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Description("是否可见"), Category("行为")]
|
|
|
|
|
public bool MCVisible
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this._mcVisible;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this._mcVisible = value == null ? true : value;
|
|
|
|
|
if (this.Site.DesignMode)
|
|
|
|
|
{
|
|
|
|
|
this.Visible = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Visible = this._mcVisible;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
[Description("是否可用"), Category("行为")]
|
|
|
|
|
public bool MCEnabled
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this._mcEnabled;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this._mcEnabled = value == null ? true : value;
|
|
|
|
|
if (this.Site.DesignMode)
|
|
|
|
|
{
|
|
|
|
|
this.Enabled = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.Enabled = this._mcEnabled;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsValid
|
|
|
|
|
{
|
|
|
|
|
get { return _isValid; }
|
|
|
|
|
set { _isValid = value; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsEventValid
|
|
|
|
|
{
|
|
|
|
|
get { return this._isEventValid; }
|
|
|
|
|
set { this._isEventValid = value; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|