来源:中国自学编程网收集整理 发布日期:2008-12-02
最近看到一些关于TextBox中限制只允许输入数字的博文,这类问题常常用事后处理模式:录入字符结束后在控件离开(如Exit事件)或确认时进行判断。本文探讨控件录入操作的事前处理模式:做录入操作时屏蔽非数字字符。下面,结合笔者前段时间修改完善的开源数值文框TNumEditBox控件,介绍一个基于定制TextBox控件的解决方法。 protected override void OnKeyPress(KeyPressEventArgs e) // 屏蔽非数字键 { base.OnKeyPress(e); if (this.ReadOnly) // 只读, 不处理 return; if ((int)e.KeyChar <= 32) // 特殊键(含空格), 不处理 return; if (!char.IsDigit(e.KeyChar)) // 非数字键, 放弃该输入 { e.Handled = true; return; } }
{ if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 { this.ClearSelection(); string text = Clipboard.GetText(); for (int k = 0; k < text.Length; k++) // can not use SendKeys.Send { // 通过消息模拟键盘输入, SendKeys.Send()静态方法不行 SendCharKey(text[k]); } return true; } return base.ProcessCmdKey(ref msg, keyData); }
private void SendCharKey(char c) // 通过消息模拟键盘录入 { Message msg = new Message(); msg.HWnd = this.Handle; msg.Msg = WM_CHAR; // 输入键盘字符消息 msg.WParam = (IntPtr)c; msg.LParam = IntPtr.Zero; base.WndProc(ref msg); }
{ // 创建无内容菜单对象, 等价屏蔽该控件的上下文菜单 this.ContextMenu = new ConTextMenu(); } 由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板 ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey() 中模拟键盘输入函数SendCharKey()。见如下代码: { if (m.Msg == WM_PASTE) // 选择上下文菜单的"粘贴"操作 { this.ClearSelection(); SendKeys.Send(Clipboard.GetText()); // 模拟键盘输入 } else { base.WndProc(ref m); } }
{ if (this.SelectionLength == 0) return; int selLength = this.SelectedText.Length; this.SelectionStart += this.SelectedText.Length; // 光标在选择之后 this.SelectionLength = 0; for (int k = 1; k <= selLength; k++) this.DeleteText(Keys.Back); }
private void DeleteText(Keys key) // 删除字符并计算SelectionStart值 { int selStart = this.SelectionStart; if (key == Keys.Delete) // 转换Delete操作为BackSpace操作 { selStart += 1; if (selStart > base.Text.Length) return; } if (selStart == 0 || selStart > base.Text.Length) // 不需要删除 return; if (selStart == 1 && base.Text.Length == 1) { base.Text = ""; base.SelectionStart = 0; } else // selStart > 0 { base.Text = base.Text.Substring(0, selStart - 1) + base.Text.Substring(selStart, base.Text.Length - selStart); base.SelectionStart = selStart - 1; } }
|
C# TextBox中只允许输入数字的解决方法
最新推荐文章于 2024-04-16 20:21:48 发布