2016-10-11 57 views
0

我目前正在研究计算器项目,并遇到两个问题。 第一个问题是如何处理按键事件,以便数字加(+ -/*。)全部有效,但是其他每个键都被阻止。继承人的代码即时通讯使用的那一刻:计算器按键手柄

if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) 
{ 
    e.Handled = true; 
} 

我知道我可以通过使用&& (e.KeyChar != '+') && (e.KeyChar != '-')单独添加每一个符号,但有没有处理所有这些密钥的生成的更简单更有效的方式?

编辑:对不起忘了提,我的计算器使用文本框所以这就是为什么我要阻止使用字母和一些符号

我的第二个问题是,我怎么能阻止用户能够编写一个数字中有两个或多个小数点,例如9.5.6或0.3.2.9?

由于

+1

这可以通过的StateMachine来解决。看看https://github.com/dotnet-state-machine/stateless –

+0

根据你正在处理的事件,只要检查你想要的密钥应该确保没有其他键触发事件。例如。 if(e.KeyChar =='+'){} else if(e.KeyChar ==' - '){}'。 –

+0

至于第二个问题,一个混乱的解决方案是保持全局布尔值(例如isDecimalEntered)并处理textbox textchanged事件,每次更新布尔值。更好的解决方案就是在textchanged处理程序中使用Decimal.TryParse()。参考:[Decimal.TryParse方法(字符串,十进制)](https://msdn.microsoft.com/en-us/library/9zbda557(v = vs.110).aspx) –

回答

0

上声明类级别char数组:

private char[] allowed = new char[] 
{ 
    '/','*','+','-' 
}; 

在按键事件:

if (!char.IsDigit(e.KeyChar) && !allowed.Contains(e.KeyChar)) 
    { 
     e.Handled = true; 
    }