'简单'计算器 - C#(设置焦点在文本框2 ...)

时间:2014-10-09 15:52:03

标签: c# winforms calculator

为了给你一些编程背景,我是软件工程专业的第一年(本学年开始)。我已经编程了一年中最好的部分,主要是使用HTML和Python。我将在整个学位期间使用的语言是C#。 (我对这种编程语言还很陌生),使用的IDE是Visual Studio 2013。

因为我在3周前刚刚开始上课,所以我有一项任务要做。它是创建一个简单的计算器,可以添加,减去,乘,除以用户输入的各种数字。我已经完成了这项工作,并为用户实现了一种使用浮点数进行数学运算的方法。

为了使计算器更加用户友好,我决定根据Windows计算器的布局添加数字按钮。它有两个输入文本框和一个输出文本框,允许用户复制,然后将他们的答案粘贴到其他文档等。我只有4个操作员按钮; +, - ,*,/。另外,我还添加了一个“退出”按钮。

每当用户输入两个值时,他们必须按下其中一个操作员按钮。例如;如果用户在'txtNum1'中键入 10 ,在'txtNum2'中键入 20 ,则按 btnAdd',总和的值将以'txtAnswer'表示。

(我会提供表格图片,但我在本网站上要求至少10个声望点,所以提前道歉)

我对表格的问题是; - 我只能在一个文本框中输入值(使用屏幕上的鼠标+可用按钮)。我已经尝试使用布尔值来检查“焦点”是否已设置到特定的框然后从那里开始,但我完全迷失了下一步该做什么。我的讲师实际上建议我使用这个布尔方法来帮助解决问题。

非常感谢任何建议+如果你们教我一个更好的代表我的代码的方法,也许通过使用函数来减少金额,我将不胜感激。我总是热衷于学习新的技巧+技巧。

这是源代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AddUpNums
{
    public partial class Form1 : Form
    {
        Boolean ff;

        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }

        private void checkForEmptySpace()
        {
            if (txtNum1.Text == "")
                txtNum1.Text = "0";
            if (txtNum2.Text == "")
                txtNum2.Text = "0";
        }

        private void btnAddUp_Click(object sender, EventArgs e)
        {
            checkForEmptySpace();
            double num1, num2, sum;
            num1 = double.Parse(txtNum1.Text);
            num2 = double.Parse(txtNum2.Text);
            sum = num1 + num2;
            txtAnswer.Text = Convert.ToString(sum);

        }

        private void btnSubtract_Click(object sender, EventArgs e)
        {
            checkForEmptySpace();
            double num1, num2, sum;
            num1 = double.Parse(txtNum1.Text);
            num2 = double.Parse(txtNum2.Text);
            sum = num1 - num2;
            txtAnswer.Text = Convert.ToString(sum);
        }

        private void btnMultiply_Click(object sender, EventArgs e)
        {
            checkForEmptySpace();
            double num1, num2, sum;
            num1 = double.Parse(txtNum1.Text);
            num2 = double.Parse(txtNum2.Text);
            sum = num1 * num2;
            txtAnswer.Text = Convert.ToString(sum);
        }

        private void btnDivide_Click(object sender, EventArgs e)
        {
            checkForEmptySpace();
            double num1, num2, sum;
            num1 = double.Parse(txtNum1.Text);
            num2 = double.Parse(txtNum2.Text);
            sum = num1 / num2;
            txtAnswer.Text = Convert.ToString(sum);
        }

        private void btn0_Click(object sender, EventArgs e)
        {
            //txtNum2.Focus();
            //if (txtNum2.Focus() == true)
            //   txtNum2.Text += "0";
            //if (txtNum1.Focus() == true)
            //   txtNum1.Text += "0";


        }

        private void btn1_Click(object sender, EventArgs e)
        {
            txtNum1.Text += "1";
            if (ff)
                txtNum2.Text += "1";

        }

        private void txtNum1_TextChanged(object sender, EventArgs e)
        {

        }



        private void txtNum2_MouseClick(object sender, MouseEventArgs e)
        {

            ff = true;

        }
    }
}

2 个答案:

答案 0 :(得分:2)

布尔值将像你描述的那样工作。只需在用户点击任一文本框时标记它:

private void txtNum1_Click(object sender, EventArgs e)
{
   ff = false;
}

private void txtNum2_Click(object sender, MouseEventArgs e)
{
   ff = true;
}

现在,如果ff为false,您希望写入txtNum1txtNum2如果ff为真。

对于数字按钮,我会写一个Click事件,然后将所有10个数字按钮连接到它

private void btn_Click(object sender, EventArgs e)
{
   if(ff)
      txtNum2.Text += (sender as Button).Text;       
   else       
      txtNum1.Text += (sender as Button).Text;       
}

假设每个Button的文字只是12等。

在尝试减少代码时,您可以看到每个操作的功能几乎完全相同,除了一行。这是一个很好的迹象,你可以重构:

private void btnOperator_Click(object sender, EventArgs e)
{
    checkForEmptySpace();
    double num1, num2, sum;
    num1 = double.Parse(txtNum1.Text);
    num2 = double.Parse(txtNum2.Text);

    double result = 0;
    switch((sender as Button).Name)
    {
       case "btnSubtract":
          result = num1 - num2;
          break;
       case "btnAdd":
          //...
    }  

    txtAnswer.Text = Convert.ToString(sum);
}

答案 1 :(得分:0)

我建议使用Enter事件,因为这是控件获得焦点的地方。以下是一些可能有用的示例代码:

private void OnEnter(object sender, EventArgs e)
    {
        if (sender == this.textBox1)
        {
            if (this.textBox1.Text == "")
            {
                this.textBox1.Text = "0";

                if (textBox2.Text == "0")
                    this.textBox2.Text = "";

            }
        }
        else
        {
            if (this.textBox2.Text == "")
            {
                this.textBox2.Text = "0";

                if (textBox1.Text == "0")
                    this.textBox1.Text = "";
            }
        }
    }

然后,要将事件应用到文本框,您需要做的就是:

textBox1.Enter += OnEnter;
textBox2.Enter += OnEnter;

我同意Jonesy您应该努力抽象代码以提高可重用性。