【问题标题】:TextBox handled doesn't work in some case处理的文本框在某些情况下不起作用
【发布时间】:2018-01-15 13:58:09
【问题描述】:

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

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 = truereturn 但数字已实现在文本框中。

为什么会这样?

编辑:创建表单和具有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 表单:

public partial class MessageBoxWithValue : Form
{
    public bool brojevi = false;
    public bool slova = false;
    public bool znakovi = false;
    public bool razmak = false;

    public double maxBroj = -1;
    public int maxKaraktera = -1;

    public string returnValue;

    public MessageBoxWithValue(string naslov, string opis)
    {
        InitializeComponent();
        this.Text = naslov;
        label1.Text = opis;
    }

    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;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        this.Close();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
        {
            Uspesno();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Uspesno();
    }

    private void Uspesno()
    {
        this.DialogResult = DialogResult.OK;
        returnValue = textBox1.Text;
    }
}

【问题讨论】:

  • 简短的回答是你的逻辑显然遗漏了一些东西。但是,这不是一个最小的可行代码。很难知道是什么影响了这些变量中的大多数,因此很难准确地了解发生了什么
  • 使用调试器,单步执行语句并检查每一步发生的情况。我怀疑可能 textBox1.Text 包含旧值,直到处理程序退出。
  • 在匈牙利语中使用变量名称并没有真正的帮助(嗯,很可能它确实对您有所帮助,但很难猜出您正在尝试以这种方式实现什么) -你能把它们翻译成有意义的英文变量名吗?如果您很难将它们翻译成有意义的名称,那么您可能缺乏概念。
  • 我添加了整个代码。如果您需要,我可以将变量翻译成英文。

标签: c# winforms textbox


【解决方案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。不幸的是,这不会按预期工作,因为在 KeyPress 事件处理程序完成之前不会设置 textBox1.Text

假设您正在输入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 了解如何在现有字符串中插入新字符。

【讨论】:

  • 现在我知道问题出在哪里了,但没有告诉你如何解决它。那我应该怎么处理呢?
  • @AleksaRistic 我有点着急,稍后会尝试扩展我的答案。
猜你喜欢
  • 2018-11-28
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2017-06-29
相关资源
最近更新 更多