我有2个组合框:
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个字符。在第一个数字之后,它会自动冻结。
答案 0 :(得分:1)
每当Text
的{{1}}属性发生更改时,都会引发事件TextBox
- 无论该更改的原因是什么(通过用户输入或代码)。
如果更改是由用户或代码进行的,则需要处理不同的事件。只需检查TextChanged
属性即可。
Enabled
答案 1 :(得分:0)
我认为问题出在TextChanged事件中。当您开始输入(输入1个字符)时,它将开始评估。如果它是有效数字 - 它将禁用其他文本框并更改该文本框上的文本。这将触发另一个文本框的效果,该文本框应该是一个有效的数字 - 从而禁用当前的文本框,导致冻结性质。
尝试TextBoxOutletPercentage_Leave - 当你离开那个文本框时应该触发它。
答案 2 :(得分:0)
这是因为TextChanged
事件不仅通过手动输入触发,而且还通过以编程方式更改文本来触发。
当您输入Inlet
时,如果它是有效值,它会使用有效值更新Outlet
,然后会传播回Inlet
。幸运的是,此时它应该具有相同的值,因此没有进一步的传播,但如果其中一个计算出错,它将永远陷入僵局。
但是,由于您的TextChanged
个事件都会禁用其他输出,因此无论如何都会以两个禁用的文本框结束。
最快的解决方法是使用KeyUp
事件,但TBH不是最佳方式。
更好的是,您可能会考虑使用TrackBar
来调整值,并使用两个Label
来显示值,因为Inlet
和Outlet
都应该相加我可以想象,如果窗户的空间有限,而且使用需要精确控制,这可能不是最好的方法,但除此之外,它可以使用户的生活更轻松。
在您当前的逻辑中,在开始时,除非您预先设置值,否则它将为零,并且当您单击某个按钮以继续您的过程时,如果两个值都有效,则需要另一个验证。添加的验证很容易导致程序脆弱。此外,使用消息框可能不是编程的最佳实践。
最后,我假设您不希望限制用户只更改一个框,换句话说,如果用户最初更改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
它将确保只禁用一个组合框,但您必须考虑何时启用两者以便能够编辑第二个组合