处理的TextBox在某些情况下不起作用

时间:2018-01-15 13:58:09

标签: c# winforms textbox

我有文本框,当我创建该表单时,我传递了一些值,然后我阻止用户根据传递的值使用此代码将一些内容输入到文本框中:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!brojevi && char.IsDigit(e.KeyChar))
    {
        e.Handled = true;
        return;
    }
    if (!slova && char.IsLetter(e.KeyChar))
    {
        e.Handled = true;
        return;
    }
    if (!znakovi && char.IsPunctuation(e.KeyChar) || !znakovi && char.IsSymbol(e.KeyChar))
    {
        e.Handled = true;
        return;
    }
    if (!razmak && char.IsSeparator(e.KeyChar))
    {
        e.Handled = true;
        return;
    }
    if (maxKaraktera != -1 && (textBox1.Text.Length + 1) > maxKaraktera)
    {
        e.Handled = true;
        return;
    }
    if (String.IsNullOrWhiteSpace(textBox1.Text))
    {
        return;
    }
    if (maxBroj != -1 && Convert.ToDouble(textBox1.Text) > maxBroj)
    {
        e.Handled = true;
        return;
    }
}

问题是我启用了brojevi并将maxBroj设置为10

现在,当我尝试输入一些字符时,它会检查slova不是true,设置e.Handled = truereturn,而在我的文本框中字符不是估算的没关系。

但是当我尝试插入大于10的数字(比方说12)时,它会转到if语句,检查if(maxBroj != -1 && Convert.ToDoube(textBox1.Text) > maxBroj)并输入它,设置e.Handled = true和{ {1}}但是号码是在文本框中实现的。

为什么会这样?

编辑:创建包含return

的表单和表单的代码

创建自:

textbox

以下是MessageBoxWithValue msg = new MessageBoxWithValue("Unesite kolicinu", "Unesite zeljenu kolicinu. Maksimum: " + aa.maxKolicina.ToString()); msg.brojevi = true; msg.maxBroj = aa.maxKolicina; msg.ShowDialog(); if(msg.DialogResult == DialogResult.OK) { kol = Convert.ToDouble(msg.returnValue); } else { return; } 表格:

MessageBoxWithValue

1 个答案:

答案 0 :(得分:1)

  

但是当我尝试插入大于10的数字时(让我们说12),它会转到if语句,它检查if(maxBroj != -1 && Convert.ToDoube(textBox1.Text) > maxBroj)并输入它,设置e.Handled = true并返回但号码是在文本框中实现的。

我希望我的问题正确无误。您正尝试按其值过滤数字(例如maxBroj设置为10)并且您期望

if (maxBroj != -1 && Convert.ToDouble(textBox1.Text) > maxBroj)
{
    e.Handled = true;
    return;
}

不允许输入数字>10。不幸的是,这不会按预期工作,因为textBox1.TextKeyPress事件处理程序完成之前不会被设置。

我们假设你正在进入14。当第一个KeyPress事件被引发(1)时,textBox1.Text为空。你是从

回来的
if (String.IsNullOrWhiteSpace(textBox1.Text))
{
    return;
}

之后textBox1.Text设置为"1"。然后引发第二个KeyPress事件。 textBox1.Text"1",因此该方法无法进入块

if (maxBroj != -1 && Convert.ToDouble(textBox1.Text) > maxBroj)
{
    e.Handled = true;
    return;
}

之后textBox1.Text将设置为"14",但这对您的验证来说太迟了。

您必须计算预期的新值。有关如何在现有字符串中插入新字符,请参阅this question