C# 中怎么利用TextBox输入数字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
1、重写键盘事件OnKeyPress()
键盘输入的字符可以通过重写c# textbox数字控件的OnKeyPress()事件处理,见如下代码:
protected override void OnKeyPress(KeyPressEventArgs e) // 屏蔽非数字键 { base.OnKeyPress(e);2、重写命令键处理方法ProcessCmdKey()
可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法 SendKeys.Send(),但可以通过控件的WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 {
this.ClearSelection();
string text = Clipboard.GetText();
for (int k = 0; k < text.Length; k++)
{
SendCharKey(text[k]);
}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void SendCharKey(char c) // 通过消息模拟键盘录入 { Message msg = new Message();
3、重写消息处理方法WndProc()
可以在定制c# textbox数字控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码:
public class CustomTextBox: TextBox { // 创建无内容菜单对象, 等价屏蔽该控件的上下文菜单 this.ContextMenu = new ConTextMenu();
}
由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板 ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey() 中模拟键盘输入函数SendCharKey()。见如下代码:
protected override void WndProc(ref Message m) // 捕获Mouse的Paste消息 { if (m.Msg == WM_PASTE) // 选择上下文菜单的"粘贴"操作 { this.ClearSelection(); SendKeys.Send(Clipboard.GetText()); // 模拟键盘输入 } else { base.WndProc(ref m); } }4、消除选择ClearSelection()、删除字符DeleteText()
还必须分析前面代码中的两个函数:
ClearSelection()用以清除当前的选择文本,即清除this.SelectedText
DeleteText()则删除当前字符
需要指出其中的技巧,就是转换Delete键操作为BackSpace操作。此外,函数DeleteText()还需要确定当前的this.SelectionStart值。具体代码如下:
private void ClearSelection() // 清除当前TextBox的选择 { 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; } }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注天达云行业资讯频道,感谢您对天达云的支持。