ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Devexpress 11.2 控件使用之 - DxValidationProvider 校验规则配置与错误提示验证

Devexpress 11.2 控件使用之 - DxValidationProvider 校验规则配置与错误提示验证 1. DevExpress 11.2 表单校验为什么总在提交时才报错WinForms 做数据录入最怕的不是控件不会用而是用户点了保存才发现一堆输入框是空的。Devexpress 11.2 里的 DxValidationProvider 就是专门解决这个问题的组件它能给任意编辑器控件挂上校验规则在失焦、输入或手动触发时给出红框、图标和错误文字提示。适合谁适合正在维护老版本 DevExpress 项目、又不想大改 UI 框架的 WinForms 开发者。我见过太多项目把校验逻辑写在按钮点击事件里一堆 if-else 判断文本框是否为空、格式是否正确代码又臭又长提示还只能用 MessageBox 弹窗。用户被弹窗打断三次就烦了。DxValidationProvider 的价值在于把「规则」和「控件」解耦规则是一个独立的类控件只需要注册规则校验时机由 ValidationMode 控制。这篇文章聚焦三件事第一怎么继承 ValidationRule 写一个可复用的非空校验第二怎么把规则挂到 TextEdit 上并设置图标位置和错误样式第三怎么用 ValidationMode 控制自动校验还是手动校验以及验证时怎么拿到具体哪个控件没过。全程基于 Devexpress 11.2 的 API代码可以直接贴进你的 Form 里跑。需要说明的是DxValidationProvider 本身是本地组件不依赖网络。但如果你在项目里同时用到了大模型辅助生成校验规则、或者想让 AI 帮你把一堆字段的校验配置批量生成出来可以配合 TaoToken 的模型对话能力来加速。下面会先讲清楚组件本身的配置再讲怎么把这类重复劳动交给工具。2. DxValidationProvider 前置准备与命名空间引用在动手写规则之前先把环境理清楚。Devexpress 11.2 的 DXErrorProvider 程序集在安装目录下的 Components 文件夹里项目需要引用DevExpress.XtraEditors.v11.2.dll和DevExpress.Data.v11.2.dll。如果你用的是 NuGet包名是DevExpress.XtraEditors但 11.2 这个版本比较老NuGet 上不一定有对应版本多数老项目还是直接引 DLL。命名空间这块核心就两个using DevExpress.XtraEditors.DXErrorProvider; using System.Windows.Forms;第一个命名空间提供ValidationRule、ValidationMode、ErrorType、ErrorIconAlignment这些类型。第二个是 Control 基类所在因为Validate方法的签名里用到了Control。工具箱里找到DXValidationProvider组件拖到 Form 上默认名字是dxValidationProvider1。它不在可视化控件区域显示而是在窗体下方的组件托盘里。选中它属性窗口里能看到ValidationMode属性默认是Auto。这里有个容易踩的坑很多人拖了组件却忘了设置ValidationMode结果发现输入框失焦时没反应以为组件坏了。其实Auto模式下只有控件内容发生变化且失去焦点时才会触发校验。如果你希望一打开窗体就校验或者点按钮才校验就得改成Manual。另外DXValidationProvider和DXErrorProvider是两个不同的东西。前者管校验规则和触发时机后者管错误图标的显示。11.2 里DXValidationProvider内部已经集成了错误提示能力通过SetIconAlignment和SetValidationRule就能同时控制图标位置和规则不需要再单独拖一个DXErrorProvider。这一点在官方文档里写得比较绕实际用的时候记住一个组件就够了。如果你打算用 AI 辅助生成一批字段的校验规则代码可以先把字段名和规则类型列成清单然后通过 TaoToken 的模型对话接口让模型输出对应的 C# 代码片段。接口地址是https://taotoken.net/api模型对话入口在https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。这样做的目的是减少手写重复规则的时间但规则本身的逻辑还是得你自己确认。3. 可复制的校验规则配置与错误提示样式这一节是核心直接给可复制的代码。先写一个非空校验规则类继承ValidationRuleusing DevExpress.XtraEditors.DXErrorProvider; using System.Windows.Forms; public class StringEmptyValidation : ValidationRule { public override bool Validate(Control control, object value) { string str value as string; if (!string.IsNullOrEmpty(str) str.Trim().Length 0) { return true; } return false; } }注意value可能是 null所以用as string比直接强转安全。Trim()是为了防止用户只输入空格就通过校验。接下来在 Form 的构造函数或 Load 事件里配置规则和图标位置private void Form1_Load(object sender, System.EventArgs e) { // 创建规则实例 StringEmptyValidation emptyValidation new StringEmptyValidation(); emptyValidation.ErrorText 用户名不能为空; emptyValidation.ErrorType ErrorType.Critical; // 设置校验模式为手动点按钮时才校验 dxValidationProvider1.ValidationMode ValidationMode.Manual; // 设置图标显示在控件右侧中间 dxValidationProvider1.SetIconAlignment(this.tbx_Userid, ErrorIconAlignment.MiddleRight); // 把规则挂到控件上 dxValidationProvider1.SetValidationRule(this.tbx_Userid, emptyValidation); }ErrorType有三个值Critical、Warning、Information。Critical显示红色错误图标Warning显示黄色警告图标Information显示蓝色信息图标。错误提示文字的颜色和图标样式会跟着ErrorType变不需要额外写绘制代码。如果你想让错误提示文字显示在控件下方而不是图标旁边可以设置DXValidationProvider的ErrorTextPosition属性但 11.2 里这个属性在DXErrorProvider上更完整。实际做法是dxValidationProvider1.ErrorTextPosition ErrorTextPosition.Bottom;这样错误文字会出现在控件下方图标仍然在右侧。再给一个带正则的邮箱校验规则方便你直接套用public class EmailValidation : ValidationRule { private static readonly System.Text.RegularExpressions.Regex EmailRegex new System.Text.RegularExpressions.Regex(^[^\s][^\s]\.[^\s]$); public override bool Validate(Control control, object value) { string str value as string; if (string.IsNullOrEmpty(str)) return false; return EmailRegex.IsMatch(str.Trim()); } }挂载方式和上面一样只是ErrorText改成「邮箱格式不正确」。这里给一个配置对照表方便你快速查参数属性/方法作用常用值ValidationMode校验触发时机Auto / ManualErrorType错误级别与图标颜色Critical / Warning / InformationErrorText错误提示文字自定义字符串SetIconAlignment图标相对控件的位置MiddleRight / TopRight / BottomLeftSetValidationRule绑定规则到控件规则实例ErrorTextPosition错误文字位置Bottom / Right如果你有十几个字段要配手写确实累。我试过把字段名和规则类型整理成 JSON然后让模型生成对应的 C# 代码块再人工核对一遍。TaoToken 的 API 地址是https://taotoken.net/api接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有请求格式说明。注意这只是辅助生成代码规则逻辑必须自己确认不能直接上生产。4. 验证请求与成功结果手动校验怎么拿到具体控件配置写完了怎么验证它真的生效分两步先测自动模式再测手动模式。自动模式下把ValidationMode设回Auto运行程序在tbx_Userid里什么都不输然后点一下别的控件让它失焦。你应该能看到右侧出现红色图标鼠标悬停显示「用户名不能为空」。如果没出现检查SetValidationRule是否在Load里执行了以及控件名是否写对。手动模式更常用因为提交前统一校验体验更好。在保存按钮的点击事件里这样写private void btnSave_Click(object sender, System.EventArgs e) { bool isValid dxValidationProvider1.Validate(); if (!isValid) { // 拿到第一个校验失败的控件 Control firstInvalid dxValidationProvider1.GetInvalidControls().Length 0 ? dxValidationProvider1.GetInvalidControls()[0] : null; if (firstInvalid ! null) { firstInvalid.Focus(); } return; } // 校验通过执行保存逻辑 MessageBox.Show(校验通过可以保存); }Validate()返回 bool全部通过返回 true有任何一个失败返回 false。GetInvalidControls()返回一个 Control 数组里面是所有没通过校验的控件。你可以遍历这个数组把每个控件的错误信息收集起来或者只聚焦第一个。成功的结果是点保存按钮时如果用户名为空焦点自动跳到tbx_Userid红色图标出现错误文字显示如果填了内容弹窗提示校验通过。整个过程没有 MessageBox 打断错误提示直接挂在控件上。再给一个多字段校验的例子假设有用户名、邮箱、年龄三个字段private void SetupValidations() { var emptyRule new StringEmptyValidation { ErrorText 不能为空, ErrorType ErrorType.Critical }; var emailRule new EmailValidation { ErrorText 邮箱格式不正确, ErrorType ErrorType.Critical }; var ageRule new AgeValidation { ErrorText 年龄必须是1-120的数字, ErrorType ErrorType.Warning }; dxValidationProvider1.ValidationMode ValidationMode.Manual; dxValidationProvider1.SetIconAlignment(tbx_Userid, ErrorIconAlignment.MiddleRight); dxValidationProvider1.SetIconAlignment(tbx_Email, ErrorIconAlignment.MiddleRight); dxValidationProvider1.SetIconAlignment(tbx_Age, ErrorIconAlignment.MiddleRight); dxValidationProvider1.SetValidationRule(tbx_Userid, emptyRule); dxValidationProvider1.SetValidationRule(tbx_Email, emailRule); dxValidationProvider1.SetValidationRule(tbx_Age, ageRule); }AgeValidation自己写一下判断int.TryParse并且范围在 1 到 120 之间。验证的时候故意把邮箱填成abc年龄填成200点保存。你会看到邮箱和年龄两个控件同时出现错误图标焦点跳到第一个失败的控件。这就是手动校验的好处一次性把所有问题暴露出来而不是修一个再发现下一个。如果你在项目里用 Claude Code 或者 Cline 这类工具辅助写代码可以把这段校验逻辑作为上下文喂给模型让它帮你生成单元测试。TaoToken 的 Coding Plan 入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite适合长期做编码辅助的场景。但记住生成的测试也要自己跑一遍。5. 常见报错排查401、local proxy failed 与规则不生效这一节列几个真实会遇到的报错和排查路径。报错一规则不生效失焦没反应。最常见的原因是ValidationMode设成了Manual但你没在按钮里调Validate()。另一个原因是SetValidationRule在Load之前调用了控件还没初始化。解决办法是把配置代码放到Form_Load或构造函数里InitializeComponent()之后。报错二GetInvalidControls()返回空数组但Validate()返回 false。这种情况通常是因为规则挂在了容器控件上而不是编辑器控件上。SetValidationRule的第一个参数必须是TextEdit、ComboBoxEdit这类编辑器不能是Panel或GroupControl。报错三401 Unauthorized。如果你在用 TaoToken 的 API 辅助生成代码请求返回 401说明 API Key 没带对或者过期了。检查请求头里的Authorization: Bearer 你的KeyKey 在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite生成。注意 Key 只在创建时显示一次没保存就得重新生成。报错四local proxy failed。这个报错一般出现在你本地配了代理但代理没启动或者端口被占用。排查步骤先确认本地代理进程是否在跑再检查端口是否被其他程序占用。如果你没有主动配代理检查一下环境变量里有没有HTTP_PROXY或HTTPS_PROXY指向一个不存在的地址。清掉这两个环境变量再试。报错五reading choices 相关错误。这类报错通常出现在调用模型接口时返回的 JSON 结构里没有choices字段。原因可能是请求体格式不对比如model参数写错了或者messages数组为空。对照接入文档检查请求体文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。报错六OAuth 相关错误。如果你用的是 Claude Code 或 Codex 这类需要 OAuth 的工具报 OAuth 错误通常是 token 过期或回调地址不匹配。重新走一遍授权流程确认回调地址和工具里配置的一致。再给一个排查清单按顺序检查注意先确认dxValidationProvider1是否真的拖到了 Form 上而不是只写了代码没实例化。再确认SetValidationRule的控件名和实际控件名一致。最后确认ValidationMode和你的触发方式匹配。如果你在排查过程中需要快速验证某个 API 的返回格式可以用模型对话直接问入口在https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。把报错信息贴进去让模型帮你分析可能的原因比翻文档快。6. 把校验配置沉淀成可复用模板最后说一个实用技巧。DxValidationProvider 的配置代码在不同 Form 之间高度重复与其每个窗体复制一遍不如抽一个静态帮助类public static class ValidationHelper { public static void BindRequired(DXValidationProvider provider, Control control, string errorText) { var rule new StringEmptyValidation { ErrorText errorText, ErrorType ErrorType.Critical }; provider.SetIconAlignment(control, ErrorIconAlignment.MiddleRight); provider.SetValidationRule(control, rule); } public static void BindEmail(DXValidationProvider provider, Control control) { var rule new EmailValidation { ErrorText 邮箱格式不正确, ErrorType ErrorType.Critical }; provider.SetIconAlignment(control, ErrorIconAlignment.MiddleRight); provider.SetValidationRule(control, rule); } }调用的时候就变成一行ValidationHelper.BindRequired(dxValidationProvider1, tbx_Userid, 用户名不能为空); ValidationHelper.BindEmail(dxValidationProvider1, tbx_Email);这样新窗体接入校验的成本从十几行降到两三行。如果你有大量字段可以把字段名和规则类型的映射写进配置文件运行时反射绑定。这一步如果想让模型帮你生成映射代码可以用 TaoToken 的 APIBase URL 填https://taotoken.net/apiKey 从控制台拿模型 ID 根据你用的模型填。控制台入口在https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite。实测下来把校验规则抽成帮助类之后新增一个字段的校验时间从五分钟降到三十秒。而且规则集中管理改错误提示文字只需要改一个地方。这个模式在 11.2 上跑得很稳不需要升级到新版本也能用。
返回列表