【问题标题】:How to accept only numbers and a single period on textbox如何在文本框中只接受数字和单个句点
【发布时间】:2012-08-25 21:10:33
【问题描述】:

我有一个数据绑定的 WPF 文本框。我需要限制文本框上的用户输入,使其只接受数字和一个句点(用于显示小数)。

我知道我可以用“Winforms”的方式处理这个问题,并在 KeyPress 事件中验证每个输入,但我想知道在 WPF 中是否有更简洁甚至是正确的方法来执行此操作(特别是因为我正在对文本框进行数据绑定) .

【问题讨论】:

标签: c# .net wpf string textbox


【解决方案1】:

使用 WPF 提供的 ValidationRules。

xaml 将是:

<TextBox>
    <TextBox.Text>
        <Binding Path="Name">
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

文本框属性的代码是(使用正则表达式进行验证):

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        if (!Regex.IsMatch(value, @"^((?:[1-9]\d*)|(?:(?=[\d.]+)(?:[1-9]\d*|0)\.\d+))$"))
        {
            throw new ApplicationException("Please enter only numbers/decimals.");
        }
    }
}

来源:Validation in WPF


上面给出的正则表达式:^((?:[1-9]\d*)|(?:(?=[\d.]+)(?:[1-9]\d*|0)\.\d+))$ 可以在这个Rubular link 进行测试

正则表达式将匹配这些:

1.2
22522
0.33
3.90000

但不是这些:(您可以调整正则表达式以允许其中一些)

.999
23.35.1343
03423.23423

【讨论】:

  • 你给我的正则表达式甚至没有编译它说嵌套量词+
  • 现在试试更新的。我在+quantifier 之后有一个* 量词,Rubular 不关心,但.NET Regex 关心。
【解决方案2】:

数据绑定会影响传入/传出你要绑定数据的对象的值。要阻止用户按键,您需要使用蒙版文本框(在 winforms 中,不确定 WPF),或者您需要处理文本框中的 KeyPressedEvent 并阻止您不想按下的键发生。

我使用下面的代码只允许数字和一位小数

private void textBoxPrice_KeyPress( object sender, KeyPressEventArgs e )
        {
            if( !char.IsControl( e.KeyChar )
                && !char.IsDigit( e.KeyChar )
                && e.KeyChar != '.' )
            {
                e.Handled = true;
            }

            // only allow one decimal point
            if( e.KeyChar == '.'
                && ( sender as TextBox ).Text.IndexOf( '.' ) > -1 )
            {
                e.Handled = true;
            }
        }

【讨论】:

  • 您知道,KeyPress 事件在 WPF 中不存在
【解决方案3】:

只需使用按键事件, 并使用 ascii 字符验证按键事件。

e.KeyCode >47 && e.KeyCode

如果您需要确切的代码示例,请稍等 :)

【讨论】:

  • 简单过滤键仍然允许非常无效的值,例如 1.1.1.1.1.1.1.1
  • 啊,请为有效值添加额外的过滤器。我可以正确地给出所有编码,因为我不完全了解您的要求。如果你只修改整数的范围,那么它不会允许点。
  • 请参考@justin 的以下编码,这是我所指的。由于工作忙,我没能做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2010-10-02
  • 2012-02-19
相关资源
最近更新 更多