C# 仅文本框中的数字
上述代码工作不正常 下面是图像错误:C# 仅文本框中的数字,c#,C#,上述代码工作不正常 下面是图像错误: 问题空间是“剪贴板”如果这是针对WinForms的,我的建议是使用。这是一个专门构建的控件,只允许某些类型的用户输入 您可以通过设计器或在代码中设置掩码。 例如,对于5位数字: if (!(char.IsDigit(e.KeyChar))) { e.Handled = true; } 处理TextChanged事件或使用MaskedTextBox maskedTextBox1.Mask = "00000";
问题空间是“剪贴板”如果这是针对WinForms的,我的建议是使用。这是一个专门构建的控件,只允许某些类型的用户输入 您可以通过设计器或在代码中设置掩码。 例如,对于5位数字:
if (!(char.IsDigit(e.KeyChar)))
{
e.Handled = true;
}
处理TextChanged事件或使用MaskedTextBox
maskedTextBox1.Mask = "00000";
maskedTextBox1.ValidatingType = typeof(int);
我曾经就StackOverflow回答过类似的问题。
以下是问题的链接: 本质上,您必须将my类放入代码中,并将其应用于所有要限制输入数据的文本框
我编写的TextBoxFilter类允许您将输入限制为字母、数字、字母数字、货币和用户指定的输入。是的,这是键盘过滤的典型敌人。TextBox控件没有任何内置事件来截取剪贴板中的粘贴。您必须自己检测Ctrl+V键,并在剪贴板上显示屏幕。GetText() 逻辑很难正确。这是一个可以让这一切变得简单一点的课程。向项目中添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上。双击它并编写ValidateChar事件处理程序。与此类似,仅允许输入数字:
if (textBox1.Text.Count(a => !char.IsDigit(a)) > 0)
{
textBox1.Text = new string(textBox1.Text.Where(a => char.IsDigit(a)).ToArray());
}
守则:
private void validatingTextBox1_ValidateChar(object sender, ValidateCharArgs e) {
if (!"0123456789".Contains(e.KeyChar)) e.Cancel = true;
}
使用系统;
使用系统组件模型;
使用System.Windows.Forms;
使用系统文本;
[DefaultEvent(“ValidateChar”)]
类ValidatingTextBox:TextBox{
公共事件处理程序ValidateChar;
ValidateChar上受保护的虚拟无效(ValidateCharArgs e){
var handler=ValidateChar;
if(handler!=null)handler(this,e);
}
按键时受保护的覆盖无效(按键事件参数e){
如果(e.KeyChar>=''){//允许控制键正常工作
var args=新的validateChargs(例如KeyChar);
OnValidateChar(args);
如果(参数取消){
e、 已处理=正确;
返回;
}
}
按键(e);
}
私有无效HandlePaste(){
如果(!Clipboard.ContainsText())返回;
string text=Clipboard.GetText();
var toPaste=新的StringBuilder(text.Length);
foreach(text.ToCharArray()中的字符ch){
var args=新的ValidateCharArgs(ch);
OnValidateChar(args);
如果(!args.Cancel)toPaste.Append(ch);
}
如果(toPaste.Length!=0){
Clipboard.SetText(toPaste.ToString());
这个。粘贴();
}
}
涂胶;
受保护的覆盖无效WndProc(参考消息m){
如果(m.Msg==0x302&&!粘贴){
粘贴=真;
把手扣件();
粘贴=假;
}
else base.WndProc(参考m);
}
}
类ValidateCharArgs:EventArgs{
public ValidateCharArgs(char ch){Cancel=false;KeyChar=ch;}
公共bool Cancel{get;set;}
公共字符KeyChar{get;set;}
}
您是否测试过事件是否在粘贴时触发?我很确定它不是。Ok可能是重复的,但是如果你处理textchanged事件,不管是否处理剪贴板,你总是知道文本框中的文本类型。这是如果你只需要在字段中粘贴数字的代码
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; }
}
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;
};