根据文本框和单选按钮启用一个按钮

3
我目前正在完成一项作业,需要设置一个类似计算器的程序。它需要读取一个或两个用户输入的值(根据计算而定),然后根据这些值执行计算。
我目前有:
- 2个文本框(tbInput1和tbInput2) - 4个单选按钮 - 一个按钮(btnCalc) - 一个空标签(label),用于显示结果
其中两个单选按钮(rbtnTrap和rbtnFak)在选中时会禁用第一个文本框,另外两个单选按钮需要输入两个值,因此在选中时启用两个文本框。btnCalc应在相关数量的文本框有值时启用--相关数量的文本框取决于哪个单选按钮被选中。
问题是,当我选中rbtnTrap或rbtnFak(禁用tbInput1)并在tbInput2中输入整数时,btnCalc仍然保持禁用状态。
我试着解释一下我目前的做法:
- 在tbInput1的_TextChanged事件中,我有下面第二个if块的精确副本。当选中rbtnPot或rbtnFib时,tbInput1才处于活动状态,因此只有在这种情况下才运行该控件。 - 在tbInput2的_TextChanged事件中,由于tbInput2始终处于启用状态,而且无论选中哪个单选按钮,该控件都必须运行,因此我有下面的代码。但是,如果我选中rbtnTrap或rbtnFak而不是rbtnPot或rbtnFib,则该控件应以不同的方式运行。
以上是我的理解,欢迎给出建议和纠正。
private void tbInput2_TextChanged(object sender, EventArgs e)
{
    //For single-field values
    if ((rbtnTrap.Checked || rbtnFak.Checked) && 
        !string.IsNullOrWhiteSpace(this.tbInput2.Text))
    {
        btnCalc.Enabled = true;
    }
    else
    {
        btnCalc.Enabled = false;
    }
    // For multi-field values
    if ((rbtnPot.Checked || rbtnFib.Checked) && 
        (!string.IsNullOrWhiteSpace(this.tbInput1.Text)
        && !string.IsNullOrWhiteSpace(this.tbInput2.Text)))
    {
        btnCalc.Enabled = true;
    }
    else
    {
        btnCalc.Enabled = false;
    }
}
2个回答

2
因为这是一份作业,我不会直接给你答案,但会给你一个提示:问题出在你发布的 tbInput2_TextChanged 事件代码中。
当选中 rbtnTraprbtnFak 时,你的代码将按照一条你认为不可能的路径运行。在 tbInput2_TextChanged 代码的第一行上设置断点 (F9),输入一些文本后逐步运行代码 (F10)。
你会看到为什么你的按钮 btnCalc 被启用了,但在下一刻被禁用了
如果需要更多帮助,请随时评论。 :)

编辑

问题来自于你的 if 块。当选中其中一个 rbtnTraprbtnFak 时:

  • 你的代码将在第一个块的 if 子句中运行,然后执行 btnCalc.Enabled = true; 但是...
  • 它还将在第二个块的 else 子句中运行(因为 (rbtnPot.Checked || rbtnFib.Checked) 是 false),从而执行 btnCalc.Enabled = false;

啊哈!我终于明白为什么处理一个不为空的组件会重新禁用按钮了。但是我不太确定它来自哪里,因为我一定是以某种方式设置程序来执行它的。有任何提示吗?(没有直接的答案也完全可以。我想学习 - 而不是复制/粘贴。 :)) - Xarth
我不确定你为什么在谈论“disposing a !=null component”。你是指使用 someObject.Dispose() 中的“disposing”术语吗?(请参见我的编辑以解决您的问题) - Otiel
啊,抱歉。当我用F10运行完问题后,它带我到了designer.cs文件。我看到的第一件事是protected override void Dispose(bool disposing),在它下面是if (disposing && (components != null))。显然不是你想要的。感谢您的编辑和建议。我会尝试调整我的代码,停止在正确的子句之后进行检查。 :) - Xarth

0

我不确定我对你的问题有多少理解(抱歉,解释有点混乱),但我看到的一件事是,当你有两个控件要检查时,你只在一个事件中实现了测试。

听起来像是一个简单的问题,但我真的不明白什么被实现在哪里,谁应该做什么,所以如果我的建议无用,你可以再次解释问题,这可能有助于找到解决方案。


没问题!已经编辑过了,希望更加清晰。现在我的废话应该更有意义了 :) - Xarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接