Telerik WinForms RadGridView号码列首键非数字输入校验失效如何解决
解决方案
问题根因
RadGridView通过键盘触发单元格编辑时,执行顺序为:
- 捕获用户按下的字符
- 初始化编辑器,将捕获的字符写入编辑器输入框
- 触发
CellEditorInitialized事件
原有代码在CellEditorInitialized中绑定KeyPress事件,已经错过了首个字符的校验,导致非数字首字符可以被输入。
方案1:使用内置RadMaskedEditBoxEditor(推荐)
直接给目标列指定带数字掩码的编辑器,从根源上避免校验时机的问题,无需手动处理按键事件,稳定性更高:
// 窗体初始化或网格数据绑定完成后执行一次即可 private void Form1_Load(object sender, EventArgs e) { var phoneColumn = radGridView1.Columns["column1"] as GridViewTextBoxColumn; phoneColumn.EditorRequired += (s, args) => { var editor = new RadMaskedEditBoxEditor(); // 配置为纯数字输入,最多11位,适配国内手机号规则 editor.MaskType = MaskType.Numeric; editor.Mask = "D11"; editor.MaskedEditBoxElement.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals; args.Editor = editor; }; }
方案2:修复原有KeyPress逻辑的绑定时机
如果需要保留自定义的按键校验逻辑,将事件绑定提前到CellBeginEdit事件即可,同时记得编辑结束后解绑避免内存泄漏:
private void radGridView1_CellBeginEdit(object sender, GridViewCellCancelEventArgs e) { if (e.Column.Name != "column1") return; var editor = new RadTextBoxEditor(); radGridView1.ActiveEditor = editor; var element = editor.EditorElement as RadTextBoxEditorElement; element.TextBoxItem.KeyPress -= TextBoxItem_KeyPress; element.TextBoxItem.KeyPress += TextBoxItem_KeyPress; } private void TextBoxItem_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) { e.Handled = true; } } private void radGridView1_CellEndEdit(object sender, GridViewCellEventArgs e) { if (e.Column.Name != "column1" || e.ActiveEditor == null) return; var editor = e.ActiveEditor as RadTextBoxEditor; var element = editor.EditorElement as RadTextBoxEditorElement; element.TextBoxItem.KeyPress -= TextBoxItem_KeyPress; }
内容的提问来源于stack exchange,提问作者Mirzaie.rz
相关产品推荐
相关产品推荐

