输入按键创建额外的“1”

时间:2017-10-06 19:07:38

标签: c# winforms calculator

我正在尝试编写一个简单的Winforms计算器,并且正在努力将NumPad键分配给表单按钮。到目前为止我分配的每个按钮都能正常工作,除了Enter按钮。无论输入的表达式是什么,当按下物理输入键时,它会在答案here的末尾添加一个单独的“1”。仅按下表单按钮时,它可以正常工作。 有谁知道这是为什么,或者可以帮助我一些? 我也意识到我的一些代码是不需要的,所以让我轻松一点,我只是一个学生!

这是关键检测代码及其引入的相关方法:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            enterButton.PerformClick();
        }
        if (keyData == Keys.NumPad0)
        {
            button10.PerformClick();
        }
        if (keyData == Keys.NumPad1)
        {
            button1.PerformClick();
        }
        if (keyData == Keys.NumPad2)
        {
            button2.PerformClick();
        }
        if (keyData == Keys.NumPad3)
        {
            button3.PerformClick();
        }
        if (keyData == Keys.NumPad4)
        {
            button4.PerformClick();
        }
        if (keyData == Keys.NumPad5)
        {
            button5.PerformClick();
        }
        if (keyData == Keys.NumPad6)
        {
            button6.PerformClick();
        }
        if (keyData == Keys.NumPad7)
        {
            button7.PerformClick();
        }
        if (keyData == Keys.NumPad8)
        {
            button8.PerformClick();
        }
        if (keyData == Keys.NumPad9)
        {
            button9.PerformClick();
        }
        if (keyData == Keys.Add)
        {
            addButton.PerformClick();
        }
        if (keyData == Keys.Subtract)
        {
            minusButton.PerformClick();
        }
        if (keyData == Keys.Multiply)
        {
            timesButton.PerformClick();
        }
        if (keyData == Keys.Divide)
        {
            divideButton.PerformClick();
        }
    }
    private void enterButton_Click(object sender, EventArgs e)
    {
        operIsDone = true; //triggers final calculation
        MainCalc();
    }
    private void MainCalc()
    {
        do
        {
            if (operation == '+')
            {
                operand = stringToInt(inputString);
                inputString = cleared;
                ansCache += operand;
                operand = 0;
                break;
            }
            if (operation == '-')
            {
                if (minusButton.Tag.Equals("1"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    ansCache += operand;
                    minusButton.Tag = "2";
                    break;
                }
                else if (minusButton.Tag.Equals("2"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    ansCache -= operand;
                    break;
                }
            }
            if(operation == '*')
            {
                if (timesButton.Tag.Equals("1"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    ansCache += operand;
                    timesButton.Tag = "2";
                    break;
                }
                else if (timesButton.Tag.Equals("2"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    ansCache *= operand;
                    break;
                }
            }
            if(operation == '/')
            {
                if (divideButton.Tag.Equals("1"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    ansCache += operand;
                    divideButton.Tag = "2";
                    break;
                }
                else if (divideButton.Tag.Equals("2"))
                {
                    operand = stringToInt(inputString);
                    inputString = cleared;
                    if (operand != 0)
                    {
                        ansCache /= operand;
                    }
                    else
                    {
                        statusLabel.Text = "Cannot Divide By Zero!";
                    }
                    break;
                }
            }
            else if(operIsDone) { break; }
        }
        while (calc);

        if (operIsDone)
        {
            statusLabel.Text = Convert.ToString(ansCache) + "";
            statusText = statusLabel.Text;
        }

2 个答案:

答案 0 :(得分:1)

我的猜测是你的" 1"按钮有焦点。完成计算后,输入键将被视为单击1.输入键的标准行为被解释为单击具有焦点的按钮。尝试设置" 1"的标签索引。按钮为0.它应该开始添加可能" 2"到答案的最后。

如果是这种情况,那么我会做的是,在ProcessCmdKey中,我唯一要做的就是将回头键转移到计算器"进入"按钮。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Enter)
    {
        enterButton.Focus();
    }

键盘输入键的常规行为将负责点击该键,因此您不必执行PerformClick。

并且,将您的输入按钮设置为"接受"表单上的按钮。这意味着每当用户按下"输入"在他们的键盘上,你的"输入"按钮的点击事件将被解雇。基本上,按下"输入"用户物理键盘上的按钮就像点击你的计算器一样"输入"按钮。

基本上,我的问题是,按下Enter按钮(在计算答案之后)也被视为按下任何具有焦点的按钮,这会导致" 1"按钮的点击事件处理程序也可以执行,它调用button1.PerformClick()和" 1"被添加到计算器"显示屏幕中的内容"。

答案 1 :(得分:0)

与Agapwlesu提到的一样,可能是你的1号按钮被聚焦,输入按下1按钮以及执行你想要的功能。然而,我的解决方案有点不同。

在每个按钮的属性下,您应找到标有Tab Stop的标签。如果您为每个按钮设置等于false,则它们将无法再聚焦,因此当您按下回车键时不应该按下它们。