textchanged事件调用自定义方法但自定义方法报告文本框文本为空

时间:2014-07-16 00:26:03

标签: c# winforms events textchanged

我在一段时间内没有触及过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();
    }

1 个答案:

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

希望这有帮助。