DevExpress控件中,若是要控件的值進行校驗,須要用到DXValidationProvider控件和DXErrorProvider控件,按照正常思路,不管使用哪一個控件要實現校驗效果時都須要對每一個要校驗的控件進行校驗規則綁定,在這,寫一個擴展方法實現一勞永逸的效果。ide
擴展代碼以下:this
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DevExpress.XtraEditors.DXErrorProvider; using System.Windows.Forms; namespace ValidateForm { ///<summary> ///驗證值是否存在的驗證規則 ///</summary> public class CustomValidationRule : ValidationRule { public CustomValidationRule(Func<object, bool>validationFunction) { this.ValidateFunction = validationFunction; } ///<summary> ///獲取或設置驗證方法 ///</summary> Func<object, bool>ValidateFunction { get; set; } ///<summary> ///驗證待驗證控件的值是否已存在 ///</summary> ///<param name="control">待驗證控件。</param> ///<param name="value">待驗證控件的值</param> ///<returns>若是值已存在,返回false;不然返回true。</returns> public override bool Validate(System.Windows.Forms.Control control, object value) { if (this.ValidateFunction == null) throw new InvalidOperationException("必須設置ValidateFunction屬性"); return ValidateFunction(value); } }
public static class DXValidationExtension { static Dictionary<int, Dictionary<int, List<DXValidationProvider>>>providerDictionary; static DXValidationExtension() { providerDictionary = newDictionary<int, Dictionary<int, List<DXValidationProvider>>>(); } ///<summary> ///對控件容器中的待驗證控件進行驗證,並返回驗證結果。 ///</summary> ///<param name="container">控件容器</param> ///<returns></returns> public static bool DXValidate(this Control container) { bool isValid = true;//驗證結果 foreach (vardictinGetProviderDictionary(container)) { foreach (var provider indict.Value) { if (!provider.Validate()) { //任何一個未經過驗證,則設置驗證結果爲false isValid = false; //待驗證控件中的任何一個驗證規則未經過,當即退出,再也不驗證該控件的其餘規則 break; } } } return isValid; } public static void CustomValidation(this Control container, Control controlToValidate, string errorText, Func<object, bool> validate) { CustomValidation(container, controlToValidate, errorText, validate, false, true); } private static void CustomValidation(this Control container, Control controlToValidate, string errorText, Func<object, bool> validate, bool alignRight, bool manualValidation) { //得到帶驗證的控件的DXValidationProvider集合。 var dictionary = GetProviderDictionary(container); var providers = GetProvider(controlToValidate, dictionary); var provider = new DXValidationProvider(); provider.ValidationMode = manualValidation ? ValidationMode.Manual : ValidationMode.Auto; provider.SetIconAlignment(controlToValidate, alignRight ? ErrorIconAlignment.MiddleRight : ErrorIconAlignment.MiddleLeft); provider.SetValidationRule(controlToValidate, newCustomValidationRule(validate) { ErrorText = errorText, }); // 將DXValidationProvider添加到待驗證控件的DXValidationProvider集合中。 providers.Add(provider); } ///<summary> ///返回待驗證控件的DXValidationProvider集合 ///</summary> ///<param name="controlToValidate">待驗證控件</param> ///<param name="dictionary">待驗證控件所在的字典表</param> ///<returns></returns> private static List<DXValidationProvider>GetProvider(Control controlToValidate, Dictionary<int, List<DXValidationProvider>> dictionary) { var key = controlToValidate.GetHashCode(); if (dictionary.ContainsKey(key)) return dictionary[key]; else { var providers = newList<DXValidationProvider>(); dictionary.Add(key, providers); return providers; } } ///<summary> ///返回空間容器的待驗證控件字典 ///</summary> ///<param name="container"></param> ///<returns></returns> private static Dictionary<int, List<DXValidationProvider>>GetProviderDictionary(Control container) { var key = container.GetHashCode(); if (providerDictionary.ContainsKey(key)) { return providerDictionary[key]; } else { var providers = newDictionary<int, List<DXValidationProvider>>(); providerDictionary.Add(key, providers); return providers; } } } }
程序調用代碼示例以下:spa
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ValidateForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitValidateRoles(); } private void InitValidateRoles() { this.CustomValidation(calcEdit1, "請輸入大於0小於20的值", value => { returnConvert.ToInt32(calcEdit1.EditValue) > 0 &&Convert.ToInt32(calcEdit1.EditValue) <20; }); } private void simpleButton1_Click(object sender, EventArgs e) { if (!this.DXValidate()) return; } } }
效果如圖:code