C# 文本框不';在某些情况下不起作用

C# 文本框不';在某些情况下不起作用,c#,winforms,textbox,C#,Winforms,Textbox,我有textbox,当我创建该表单时,我传递一些值,然后我使用以下代码阻止用户根据传递的值向textbox输入一些内容: private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (!brojevi && char.IsDigit(e.KeyChar)) { e.Handled = true; return; } if (!slov

我有textbox,当我创建该表单时,我传递一些值,然后我使用以下代码阻止用户根据传递的值向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=true
return
,在我的文本框中,字符没有被插补,这是可以的

但当我尝试插入大于10的数字(比如说12)时,它会进入
if
语句,在那里它会检查
if(maxBroj!=-1&&Convert.ToDoube(textBox1.Text)>maxBroj)
并输入它,设置
e.Handled=true
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
表单:

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;
    }
}
但当我尝试插入大于10的数字(比如12)时,它会进入if语句,在该语句中它检查
if(maxBroj!=-1&&Convert.ToDoube(textBox1.Text)>maxBroj)
并输入它,设置
e.Handled=true
并返回,但该数字在textbox中实现

我希望我把你的问题说对了。您正在尝试按数值筛选数字(例如,
maxBroj
设置为10),您需要

if (maxBroj != -1 && Convert.ToDouble(textBox1.Text) > maxBroj)
{
    e.Handled = true;
    return;
}
不允许输入数字
>10
。不幸的是,这将无法按预期工作,因为在
KeyPress
事件处理程序完成之前,不会设置
textBox1.Text

假设您正在输入
14
。当引发第一个
按键
事件(
1
)时,
textBox1.Text
为空。你是从伦敦回来的

if (String.IsNullOrWhiteSpace(textBox1.Text))
{
    return;
}
之后
textBox1.Text
设置为
“1”
。然后引发第二个
按键
事件
textBox1.Text
“1”
,因此该方法不会进入块

if (maxBroj != -1 && Convert.ToDouble(textBox1.Text) > maxBroj)
{
    e.Handled = true;
    return;
}
之后
textBox1.Text
将设置为
“14”
,但这对于您的验证来说已经太晚了


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

简短的回答是,您的逻辑显然缺少某些内容。。然而,这不是一个最小可行的代码。。很难知道是什么影响了这些变量中的大多数,因此很难准确地跟踪调试器的运行情况,逐步检查语句,并检查每一步都发生了什么。我怀疑可能是textBox1。文本包含旧值,直到处理程序退出。使用匈牙利语的变量名并没有真正的帮助(很可能它确实帮助了您,但很难猜测您正试图通过这种方式实现什么)-您能将其翻译成有意义的英语变量名吗?如果您很难将它们翻译成有意义的名称,那么您可能缺乏概念。若你们需要的话,我可以把变量翻译成英语。现在我知道问题出在哪里了,但并没有告诉你们如何解决它。“那我该怎么做呢?”AleksaRistic我当时有点匆忙,稍后将尝试扩展我的答案。