C# 文本框不';在某些情况下不起作用
我有textbox,当我创建该表单时,我传递一些值,然后我使用以下代码阻止用户根据传递的值向textbox输入一些内容: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
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我当时有点匆忙,稍后将尝试扩展我的答案。