如果输入的值不正确,如何将用户限制为TextBox

时间:2014-05-22 15:53:54

标签: c# wpf textbox

在我的程序中,我有一个TextBox,其值必须设置在特定的整数范围内。如果它不在此范围内,则应警告用户,然后突出显示TextBox内部的错误文本以进行重新编辑(暗示用户必须在允许之前输入正确范围内的值离开TextBox)。 如何更改代码以便执行这些操作?

这是我到目前为止所拥有的。我正在使用TextChanged事件。此代码在TextBox上警告用户有关限制违规和重新聚焦(我想突出显示该值),但不会阻止用户随后点击它:

int maxRevSpeed;

//Max Rev Speed -- Text Changed
private void maxRevSpeed_textChanged(object sender, RoutedEventArgs e)
{
    if (maxRevSpeed_textBox.Text == "" || maxRevSpeed_textBox.Text == " ")
        maxRevSpeed = 0;
    else
    {
        maxRevSpeed = Convert.ToInt32(maxRevSpeed_textBox.Text);

        if (maxRevSpeed <= 0 || maxRevSpeed > 45)
        {
            MessageBox.Show("Reverse Sensor speed must be between 0 and 45 FPM", "Error", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        maxRevSpeed_textBox.Focus();
    }
}

请注意,这个问题是我former question的再次访问。我知道它可能会不满意#34;把这种方法用于TextBox,但不管我还是想知道如何实现这样的事情。谢谢。

更新1:

在查看了所有人的建议后,我更新了我的代码:

//Max Rev Speed -- Text Changed
private void maxRevSpeed_textChanged(object sender, RoutedEventArgs e)
{
    if (maxRevSpeed_textBox.Text == "" || maxRevSpeed_textBox.Text == " ") //Is Empty or contains spaces
        maxRevSpeed = 0;
    else if (!Regex.IsMatch(maxRevSpeed_textBox.Text, @"^[\p{N}]+$")) //Contains characters
        maxRevSpeed = 0;
    else
        maxRevSpeed = Convert.ToInt32(maxRevSpeed_textBox.Text);
}

//Max Rev Speed -- Lost Focus
private void maxRevSpeed_LostFocus(object sender, RoutedEventArgs e)
{
    if (maxRevSpeed <= 0 || maxRevSpeed > 45)
    {
        MessageBox.Show("Reverse Sensor speed must be between 0 and 45 FPM", "Error", MessageBoxButton.OK, MessageBoxImage.Warning);

        //Supposed to highlight incorrect text -- DOES NOT WORK
        maxRevSpeed_textBox.SelectionStart = 0;
        maxRevSpeed_textBox.SelectionLength = maxRevSpeed_textBox.Text.Length;
    }
}

表示integer中文字的textBox现在已在textChanged事件中处理。 LostFocus事件处理警告并重新选择不正确的文本值。但是,突出显示文本方法在textChanged事件中有效,但在其当前位置时无效。为什么会这样,我该如何解决?

3 个答案:

答案 0 :(得分:1)

您可以使用文本框的PreviewTextInput处理程序阻止用户输入文本或超出范围,请像这样调用它。

private void textBox1_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if (!char.IsDigit(e.Text, e.Text.Length - 1))
            {
                e.Handled = true;
            }
        }

上面的代码仅用于输入数字,您可以根据自己的要求进行更改,希望有所帮助:)

答案 1 :(得分:1)

如果您只想停止关注TextBox,您只需将Handled对象的KeyboardFocusChangedEventArgs属性设置为true即可当您的无效条件为真时,PreviewLostKeyboardFocus处理程序:

private void PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    e.Handled = IsInvalidValue;
}

这当然假设您输入的数据无效时设置为IsInvalidValue的{​​{1}}属性,否则设置为true

答案 2 :(得分:0)

您好我想您正在使用C#,在这里您可以找到相关的帖子:C# auto highlight text in a textbox control

正如他们所说,以下代码应该选择texbox中的文本

在Windows窗体和WPF中:

maxRevSpeed_textBox.SelectionStart = 0; maxRevSpeed_textBox.SelectionLength = textbox.Text.Length;