if (!(char.IsDigit(e.KeyChar)))
{
e.Handled = true;
}
以上代码无法正常使用
以下是图片错误:
问题空间是“剪贴板”
答案 0 :(得分:6)
如果这是针对WinForms的,我的建议是使用MaskedTextBox
代替。这是一个专用控件,仅允许某些类型的用户输入。
您可以通过设计器或代码设置遮罩。 例如,对于5位数字:
maskedTextBox1.Mask = "00000";
maskedTextBox1.ValidatingType = typeof(int);
答案 1 :(得分:2)
是的,这是键盘过滤的典型克星。 TextBox控件没有任何内置事件来拦截剪贴板中的粘贴。您必须自己检测Ctrl + V按键并屏幕Clipboard.GetText()。
正确的逻辑是很难的。这是一个可以使这一切变得更容易的课程。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。双击它并编写ValidateChar事件处理程序。像这样,只允许输入数字:
private void validatingTextBox1_ValidateChar(object sender, ValidateCharArgs e) {
if (!"0123456789".Contains(e.KeyChar)) e.Cancel = true;
}
代码:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Text;
[DefaultEvent("ValidateChar")]
class ValidatingTextBox : TextBox {
public event EventHandler<ValidateCharArgs> ValidateChar;
protected virtual void OnValidateChar(ValidateCharArgs e) {
var handler = ValidateChar;
if (handler != null) handler(this, e);
}
protected override void OnKeyPress(KeyPressEventArgs e) {
if (e.KeyChar >= ' ') { // Allow the control keys to work as normal
var args = new ValidateCharArgs(e.KeyChar);
OnValidateChar(args);
if (args.Cancel) {
e.Handled = true;
return;
}
}
base.OnKeyPress(e);
}
private void HandlePaste() {
if (!Clipboard.ContainsText()) return;
string text = Clipboard.GetText();
var toPaste = new StringBuilder(text.Length);
foreach (char ch in text.ToCharArray()) {
var args = new ValidateCharArgs(ch);
OnValidateChar(args);
if (!args.Cancel) toPaste.Append(ch);
}
if (toPaste.Length != 0) {
Clipboard.SetText(toPaste.ToString());
this.Paste();
}
}
bool pasting;
protected override void WndProc(ref Message m) {
if (m.Msg == 0x302 && !pasting) {
pasting = true;
HandlePaste();
pasting = false;
}
else base.WndProc(ref m);
}
}
class ValidateCharArgs : EventArgs {
public ValidateCharArgs(char ch) { Cancel = false; KeyChar = ch; }
public bool Cancel { get; set; }
public char KeyChar { get; set; }
}
答案 2 :(得分:0)
处理TextChanged事件或使用MaskedTextBox。
if (textBox1.Text.Count(a => !char.IsDigit(a)) > 0)
{
textBox1.Text = new string(textBox1.Text.Where(a => char.IsDigit(a)).ToArray());
}
答案 3 :(得分:0)
我在StackOverflow上回答了一个类似的问题 以下是问题的链接:Best way to limit textbox decimal input in c#
基本上,您必须将我的课程放在您的代码中并将其应用于您想要限制输入数据的所有文本框。
我写的TextBoxFilter类允许您限制进入字母,数字, AlphaNumerics ,货币和 UserSpecified 输入。
答案 4 :(得分:0)
control.TextChanged += (s, a) => {
string value = string.Empty;
foreach (char ch in control.Text.ToCharArray())
{
if (char.IsDigit(ch))
{
value += ch.ToString();
}
}
control.Text = value;
};