【问题标题】:Restricting Input to Numbers Only In Textbox? (c#) [closed]仅在文本框中将输入限制为数字? (c#) [关闭]
【发布时间】:2013-06-01 09:14:51
【问题描述】:

请原谅我问这个问题,我已经查看了与此相关的各种不同的问题,但我仍然无法实现它。

使用我看过的答案,我收集了这个,并将这个编码应用于我的文本框。

private void TxtBox5_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!(Char.IsDigit(e.KeyChar) || (e.KeyChar == (char)Keys.Back)))
            e.Handled = true;
    }

现在,当我继续运行程序时,我仍然可以在其中输入字母。我不知道下一步该怎么做,所以任何解决方案都会很棒。谢谢。

【问题讨论】:

  • 首先:在调试器中单步调试代码并确保正在调用例程
  • 如果这是一个 Windows 窗体应用程序,为什么不使用只允许数字的 NumericUpDown 控件。
  • 您使用文本框是否有特殊原因?将输入限制为数字的最简单方法是使用 numericUpDown 而不是 textBox。如果你真的需要文本框,你可以创建一个包含所有数字(可能还有小数点)的字符串或列表,然后检查你输入的字符串是否包含任何其他字符
  • Control.KeyPress 的 MSDN 文档有一个示例。
  • @Coder,我正在使用文本框,因为它看起来比 NumericUpDown 更干净。

标签: c# textbox numbers limiting


【解决方案1】:

好的,这就是我刚才做的,它100%工作,刚刚测试过。注意我的文本框被命名为serialTxtBox,你可以把它改成你的。

void serialTxtBox_TextChanged(object sender, EventArgs e)
        {
            bool enteredLetter = false;
            Queue<char> text = new Queue<char>();
            foreach (var ch in this.serialTxtBox.Text)
            {
                if (char.IsDigit(ch))
                {
                    text.Enqueue(ch);
                }
                else
                {
                    enteredLetter = true;
                }
            }

            if (enteredLetter)
            {
                StringBuilder sb = new StringBuilder();
                while (text.Count > 0)
                {
                    sb.Append(text.Dequeue());
                }                

                this.serialTxtBox.Text = sb.ToString();
                this.serialTxtBox.SelectionStart = this.serialTxtBox.Text.Length;
            }
        }

编辑:你肯定做错了什么。在您的表单构造函数中,该构造函数的名称与您的表单相同。在我的情况下 SerialGenerator,您需要初始化事件。就我而言:

public SerialGenerator()
        {
            InitializeComponent();
            this.serialTxtBox.TextChanged += serialTxtBox_TextChanged;
        }

每当有人在您的文本框中输入内容时,都会触发该方法。确保将其重命名为文本框的名称

【讨论】:

  • 我仍然可以输入字母,我做错了什么。您是否可以通过 teamviewer 或类似工具提供帮助?
  • 我们已经成功了,老实说,我非常感谢你。很抱歉没有成为最乐于助人的人,但我们都从某个地方开始。
  • 没问题,你也可以点赞,谢谢你的选择:) gl
  • 我必须有 15 名代表才能对其进行投票,但相信我,一旦成功我就尝试过。
  • 如果写在开头 var textBox = (TextBox) sender; 那么 textbox 有什么名字都没关系。
【解决方案2】:

你可以试试这个:

private void TxtBox5_KeyPress(object sender, KeyPressEventArgs e)
{
    if(!(Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)))
        { e.Handled = true; }
}

我认为这不是最好的,但我猜你可以通过稍微调整来完成这项工作。我现在没有 VS 来检查什么会起作用。

编辑:我的错。我认为您可以在文本框的 textchanged 事件上而不是在按键上使用上述一个。这更像是一个调整而不是一个解决方案。只是为了让您在遇到困难并且没有更好的解决方案时取得进步。

更新:更新了代码。请检查这个是否对您有帮助。

【讨论】:

  • 会发出错误,有一些“无效的争论”
  • 调试的时候还是没有结果。
  • 我在我的系统上检查了它,似乎工作正常。您可以尝试在表单中使用单个文本框创建一个新的 Win Forms 项目并进行测试。我认为可能还有其他原因导致此问题。
  • 开始了一个新项目,添加了文本框,添加了代码,我仍然可以输入数字。这现在真的很奇怪。
  • 但您只想输入数字,对吧?
【解决方案3】:

试试这个,希望能成功

   private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        int asciiCode = Convert.ToInt32(e.KeyChar);
        if ((asciiCode >= 48 && asciiCode <= 57))
        {


        }
        else
       {                MessageBox.Show("Not allowed!");
            e.Handled = true;


        }
    }

【讨论】:

  • 运气不好,也没有用。
【解决方案4】:

我在代码级别添加了事件,因为您的代码中可能没有正确地将事件添加到控件中。

注意:KeyPress 事件不是由非字符键引发的 你需要同时使用KeyDownKeyPress 事件

public partial class Form1 : Form
{
    private bool nonNumberEntered = false;
    public Form1()
    {
        InitializeComponent();
        textBox1.KeyDown+=new KeyEventHandler(textBox1_KeyDown);
        textBox1.KeyPress+=new KeyPressEventHandler(textBox1_KeyPress);
    }

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (nonNumberEntered == true)
        {
            e.Handled = true;
        }
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        nonNumberEntered = false;

        if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
        {
            if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
            {
                if (e.KeyCode != Keys.Back)
                {
                    nonNumberEntered = true;
                }
            }
        }
        if (Control.ModifierKeys == Keys.Shift)
        {
            nonNumberEntered = true;
        }
    }
}

参考:Control.KeyPress Event

【讨论】:

  • 如何引用 control.keypress?
  • textBox1.KeyPress+= give the event,或者您可以从控件 -> 属性 -> 设计器视图中的事件中执行此操作
  • 我现在收到一个错误,当前上下文中不存在“nonNumberEntered”。
  • 你需要在示例代码中添加nonNumberEntered标志
  • 我该怎么做?我已经看了一下,但我无法解决(对不起,不好的问题,真的刚刚开始)
【解决方案5】:

试试这个...

private void TxtBox5_KeyPress(object sender, KeyPressEventArgs e)
    {         
        int num = 0;
         e.Handled = !int.TryParse(e.KeyChar.ToString(), out num);

    }

【讨论】:

  • 运气不好,有很多错误。
  • @Fadzitt :它改变了..
  • 仍然可以输入字母,开始认为我没有包括我身边的东西。我应该在公共 Form1() 中添加任何内容
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 2020-12-01
  • 1970-01-01
  • 2013-11-15
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多