【问题标题】:Textbox KeyPress Event?文本框按键事件?
【发布时间】:2014-09-18 12:27:56
【问题描述】:

我的文本框只允许小数和'+' 它只允许 1 个小数“12.332” 我需要在“+”之前允许 1 个小数,在“+”之后允许 1 个小数 示例我有 12.43+12.23 我不能输入 12(.),因为我只允许使用 1 个小数拆分方法获取前后两部分

这是我的代码

// checks to make sure only 1 decimal is allowed
if (e.KeyChar == 46)
{
    if ((sender as TextBox).Text.IndexOf(e.KeyChar) != -1)
        e.Handled = true;
}

这是我的方法

if(textBox1.Text.Contains('+')==true )
{
    string Value = textBox1.Text;
    string[] tmp = Value.Split('+');
    string FirstValu = tmp[1];
    string SecValu = tmp[0];
}

如何使用带有事件的方法来允许'+'后的另一个小数位

【问题讨论】:

  • 只是出于好奇,你有什么理由不能有 2 个文本框?
  • 我想使用一个文本框离开事件!
  • 这不是一个真正的答案。您也可以使用 2 个文本框而不是 1 个文本框来使用 leave 事件,这样编码会容易得多。您想要做的事情具有更高的复杂性,并且基本上不会给您带来任何好处。在花一些时间帮助您之前,我只需要确保这样做是有充分理由的。
  • 请帮忙!

标签: c# winforms textbox keypress


【解决方案1】:

我会说使用两个文本框,就像有人在 cmets 中所说的那样,但是如果您想固执一点,这里有一个函数可以在文本框中的文本更改时调用的事件中运行。

void textbox_textChanged(object sender, EventArgs e)
    {
        string text = textBox.Text;
        int pointCounter = 0;
        int addCounter =0
        string temp = "";
        string numbers = "0123456789";
        for(int i =0;i<text.Length;i++)
        {
            bool found = false;
            for(int j = 0;j<numbers.Length;j++)
            {
                if(text[i]==numbers[j])
                {
                    temp+=text[i];
                    found = true;
                    break;
                }
            }
            if(!found)
            {
                if('.' == text[i])
                {
                    if(pointCounter<1)
                    {
                        pointCounter++;
                        temp+=text[i];
                    }
                }else
                    if('+' == text[i])
                    {
                        if(addCounter<1)
                        {
                            pointCounter=0;
                            addCounter++;
                            temp+=text[i];
                        }
                    }
            }
        }
        textBox.text = temp;

    }

【讨论】:

    【解决方案2】:

    我建议使用正则表达式来验证您的文本框。我还建议使用文本框验证事件比使用离开事件更好。以下是在验证事件中使用正则表达式的示例:

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        TextBox tbox = (TextBox)sender;
    
        string testPattern = @"^[+-]?[0-9]*\.?[0-9]+ *[+-]? *[0-9]*\.?[0-9]+$";
        Regex regex = new Regex(testPattern);
    
        bool isTextOk = regex.Match(tbox.Text).Success;
        if (!isTextOk)
        {
            MessageBox.Show("Error, please check your input.");
            e.Cancel = true;
        }
    }
    

    您将在 System.Text.RegularExpressions 命名空间中找到 Regex 类。还要确保您的文本框将 CausesValidation 属性设置为 true。

    作为替代方案,您可能还想使用MaskedTextBox Class

    【讨论】:

    • 注意:这也将允许使用“-”符号,例如+12.43 - 12.23。您可以更改testPattern 来做您想做的事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多