2个Combobox中的百分比数字

时间:2017-06-28 13:00:10

标签: c# textbox

我有2个组合框:

  1. 获得百分比(温度*此百分比)
  2. 接收其他百分比(温度*此百分比)
  3. 1和2必须总和100% - >这将为每个温度创建一个重量

    我已经拥有什么:2个接收这些值的组合框;

    我需要什么: 当用户输入一个%时,它会锁定另一个;此外,用户可以在Comboboxes

    中输入%
    private void TextBoxInletPercentage_TextChanged(object sender, EventArgs e)
    {
    
        int val = 0;
        int other_val = 0;
        bool res = Int32.TryParse(TextBoxInletPercentage.Text, out val);
        if (res == true && val > -1 && val < 101)
        {
            // add record
            other_val = (100 - val);
            TextBoxOutletPercentage.Enabled = false;
            TextBoxOutletPercentage.Text = other_val.ToString();
        }
        else
        {
            MessageBox.Show("Please input a percentage between 0 to 100 only.");
            return;
        }
    
    
    }
    
    private void TextBoxOutletPercentage_TextChanged(object sender, EventArgs e)
    {
    
        int val = 0;
        int other_val = 0;
        bool res = Int32.TryParse(TextBoxOutletPercentage.Text, out val);
        if (res == true && val > -1 && val < 101)
        {
            // add record
            other_val = (100 - val);
            TextBoxInletPercentage.Enabled = false;
            TextBoxInletPercentage.Text = other_val.ToString();
        }
        else
        {
            MessageBox.Show("Please input a percentage between 0 to 100 only.");
            return;
        }
    
    }
    

    问题:它只允许我在ComboBox中输入1个字符。在第一个数字之后,它会自动冻结。

4 个答案:

答案 0 :(得分:1)

每当Text的{​​{1}}属性发生更改时,都会引发事件TextBox - 无论该更改的原因是什么(通过用户输入或代码)。

如果更改是由用户或代码进行的,则需要处理不同的事件。只需检查TextChanged属性即可。

Enabled

答案 1 :(得分:0)

我认为问题出在TextChanged事件中。当您开始输入(输入1个字符)时,它将开始评估。如果它是有效数字 - 它将禁用其他文本框并更改该文本框上的文本。这将触发另一个文本框的效果,该文本框应该是一个有效的数字 - 从而禁用当前的文本框,导致冻结性质。

尝试TextBoxOutletPercentage_Leave - 当你离开那个文本框时应该触发它。

答案 2 :(得分:0)

这是因为TextChanged事件不仅通过手动输入触发,而且还通过以编程方式更改文本来触发。

当您输入Inlet时,如果它是有效值,它会使用有效值更新Outlet,然后会传播回Inlet。幸运的是,此时它应该具有相同的值,因此没有进一步的传播,但如果其中一个计算出错,它将永远陷入僵局。

但是,由于您的TextChanged个事件都会禁用其他输出,因此无论如何都会以两个禁用的文本框结束。

最快的解决方法是使用KeyUp事件,但TBH不是最佳方式。

更好的是,您可能会考虑使用TrackBar来调整值,并使用两个Label来显示值,因为InletOutlet都应该相加我可以想象,如果窗户的空间有限,而且使用需要精确控制,这可能不是最好的方法,但除此之外,它可以使用户的生活更轻松。

在您当前的逻辑中,在开始时,除非您预先设置值,否则它将为零,并且当您单击某个按钮以继续您的过程时,如果两个值都有效,则需要另一个验证。添加的验证很容易导致程序脆弱。此外,使用消息框可能不是编程的最佳实践。

最后,我假设您不希望限制用户只更改一个框,换句话说,如果用户最初更改Inlet中的值,然后决定将其更改为其他值,但是在Outlet中,您应该允许用户这样做,而不是让用户计算应该放在Inlet中的值。当用户将任何内容放入Outlet时,您当前的逻辑将永久禁用Inlet,反之亦然。

例如,在开始时,用户希望Inlet为24,它会自动计算Outlet,但用户可能会发现,哦不,我应该将Outlet设为24用户需要做什么?他/她必须计算Inlet假设为100-24 = 76,并将76放入Inlet并让程序填充Outlet。这是不自然,困难和错误问题。如果他/她改变主意,让用户输入Outlet怎么样?

要实现此可用性,您可能需要添加Leave事件以启用其他TextBox。但是,坚持一下,首先禁用的目的是什么?您无法同时更新TextBox,因此在键入时禁用其他TextBox并在离开时启用它除了幻觉之外没用。为什么不删除禁用另一个框的行?

答案 3 :(得分:0)

您可以尝试插入条件

swagger.yaml

进入TextBoxInletPercentage_TextChanged 和

swagger.json

进入TextBoxOutletPercentage_TextChanged

它将确保只禁用一个组合框,但您必须考虑何时启用两者以便能够编辑第二个组合