【问题标题】:textchanged event calling custom method but custom method reports textbox text is emptytextchanged 事件调用自定义方法,但自定义方法报告文本框文本为空
【发布时间】:2014-07-16 00:26:03
【问题描述】:

我已经有一段时间没有接触过 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 都不会知道它的存在。这两个 MessageBox 也显示不同的输出:activateEnterButton 中的那个永远不会有任何输出,而事件处理程序中的那个总是有。

任何帮助将不胜感激。谢谢。

我已经删除了对 activateEnterButton() 的调用,我已经将该代码的内容放入 textBox5 的事件处理程序中,但该按钮仍未启用。

我接受的答案没有给我想要的功能(在 textbox5 中输入数据会使按钮处于活动状态)下面的代码给了我想要的所有功能。最后,我的错误的原因是因为A)foreach从最后一个控件迭代到第一个,B)我在表单上的最后一个文本框控件是一个只读文本框控件,它的文本总是“”,因此我是总是被我早期的代码抛弃。无论如何,新代码:

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

【问题讨论】:

  • 我知道这听起来很疯狂,但是您是否尝试过设置 btnEnter.Enabled = true,而不是使用布尔变量?
  • 雪,当我在调试嵌套的'if'时遍历代码时,字符串的长度总是为零;因此永远不会进入代码的那部分。
  • 你看过控件的名字了吗?您可能甚至找不到控件。如果文本框在面板上,您需要查看面板的控件。
  • Paq,没有面板。只有 5 个标签、5 个文本框、3 个按钮和一个……下面的大 ReadOnly 文本框……我想我不想重复它,但这并不能解决我的第一个文本框问题。
  • 这是为了验证,当所有 5 个文本框都有文本时,按钮将执行一些工作然后退出?

标签: c# winforms events textchanged


【解决方案1】:

在您的activateEnterButton() 方法中,您循环通过控件,如果控件是文本框;检查是否有文字。

如果textbox1 触发了 textchanged 事件;那如何保证其他文本框中有文本?

你在你的帖子中说The two MessageBoxes show different output as well: .. 应该是。

textbox1 触发了textchanged 事件,textchanged 事件中的文本也显示在消息框中,但在方法activateEnterButton() 中,您循环遍历表单中的所有控件,因此无法保证类似的顺序textbox1 .. 5 (按该顺序循环将检查它们)并且一旦没有文本,您就会中断 pf 循环。也是如此,在您的方法中,您在消息框中看不到任何文本。

最好的方法如下(假设您有 TextBox 1..5;仅在 TextBox5 上更改了文本。)

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

希望这会有所帮助。

【讨论】:

  • @paqogomez,我明白了;编辑了我的答案。我相信 OP 检查的方式是错误的。
  • Rahul,如果任何文本框中有文本,您编写的代码似乎会启用按钮(假设我将该代码放在每个文本框 textchanged 事件中)?我研究的来源之一:dreamincode.net/forums/topic/…
  • @rossstudtman,是的,一开始我错了,但请检查我编辑的答案。你会明白为什么你会得到不同的消息框显示。
  • Rahul,不知道 foreach 不会按顺序进行,比如通过 DOM 或其他东西(javascript 参考,请原谅我);我删除了 break 语句,因此我将看到所有迭代的消息框 --> 自定义方法生成的没有消息框报告文本...不应该有 至少一个 吗?我收到六个消息框,报告 any 文本框中没有字符串。不要试图变得困难;如果我遗漏了什么你说的,请原谅我。
猜你喜欢
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多