我在一段时间内没有触及过C#,试图帮助我的新程序员朋友,并且完全被以下内容所困扰:
private void textBox1_TextChanged(object sender, EventArgs e)
{
activateEnterButton();
TextBox t = (TextBox)sender;
string theText = t.Text;
MessageBox.Show("text: " +theText);
}
private void activateEnterButton()
{
bool allGood = true;
foreach (Control control in Controls )
{
if (control is TextBox)
{
string test = ((TextBox)control).Text;
if (test.Length == 0)
{
MessageBox.Show("text: " +test);
allGood = false;
break;
}
}
}
btnEnter.Enabled = allGood;
}
我们的目标非常简单:我们有5个文本框,每个文本框都需要在启用按钮之前包含一些文本。如果每个都有文本,则启用按钮。
当我调试代码时,调试一切都没问题,但无论我在文本框中放了多少文本,activateEnterButton都不知道它在那里。两个MessageBoxes也显示不同的输出:activateEnterButton中的一个从不具有任何输出,事件处理程序中的那个总是这样。
非常感谢任何帮助。谢谢。
我已经删除了对activateEnterButton()的调用,我已将该代码的内容放入textBox5的事件处理程序中,但该按钮仍未启用。
我接受的答案并未向我提供我想要的功能(将数据输入textbox5会使按钮处于活动状态)以下代码为我提供了我想要的所有功能。最后,我的错误的原因是因为A)foreach从最后一个控件迭代到第一个控件,而B)我在表单上的最后一个文本框控件是一个ReadOnly文本框控件,它的文本总是“”,因此我是总是被我的早期代码抛弃。无论如何,新代码:
private void checkMe()
{
bool allGood = true;
foreach (Control control in Controls)
{
// Make sure the ReadOnly textbox doesn't cause false
if (control.Name.Equals("ReadOnlyTextBox"))
{
// MessageBox.Show("hidden textbox: " + ((TextBox)control).Text);
allGood = true;
}
else if (control is TextBox)
{
string test = ((TextBox)control).Text;
//MessageBox.Show("test: " + test);
if (test.Length < 1)
{
allGood = false;
// MessageBox.Show("All textboxes need input");
break;
}
else
{
allGood = true;
}
}
}
btnEnter.Enabled = allGood;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
checkMe();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
checkMe();
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
checkMe();
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
checkMe();
}
private void textBox5_TextChanged(object sender, EventArgs e)
{
checkMe();
}
答案 0 :(得分:1)
在activateEnterButton()
方法中循环控件,如果控件是文本框;检查是否有文字。
假设textbox1
已触发textchanged事件;这是如何保证其他文本框中包含文本的?
你在帖子The two MessageBoxes show different output as well:
中说过..应该是这样的。
说textbox1
已经解雇了textchanged
事件,textchanged
事件也是如此,您可以在消息框中显示文本,但是在方法activateEnterButton()
中您循环浏览所有控件表单不保证像textbox1 .. 5
这样的顺序(在那个顺序循环中会检查它们),并且一旦它没有文本就会打破pf循环。同样,在您的方法中,您也看不到消息框中的任何文本。
最佳方式如下(假设您有TextBox 1..5;仅在TextBox5上使用textchanged。)
private void textBox5_TextChanged(object sender, EventArgs e)
{
bool allGood = false;
foreach (Control control in Controls )
{
if (control is TextBox)
{
string test = ((TextBox)control).Text;
if (test.Length > 0)
{
allGood = true;
}
else
{
MessageBox.Show("Fill all textbox first");
break;
}
}
}
btnEnter.Enabled = allGood;
}
希望这有帮助。