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

本文关键字:文本 设置 简单 计算器 -C# 焦点 | 更新日期: 2023-09-27 18:26:02

为了让大家了解一下我的编程背景,我是软件工程专业的一年级学生(本学年开始)。在一年的大部分时间里,我一直在编程,主要使用HTML和Python。我将在整个学位期间使用的语言是C#。(我对这种编程语言还相当陌生),使用的IDE是Visual Studio 2013。

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

为了让计算器对用户更友好,我决定根据Windows计算器的布局添加数字按钮。它有两个输入文本框和一个输出文本框,用户可以复制答案,然后将其粘贴到其他文档中。我只有4个操作员按钮,分别是:+、-、*、/。此外,我还添加了一个"退出"按钮。

每当用户输入这两个值时,他们都必须按下其中一个操作员按钮。例如如果用户在'xtNum1'中键入10,在'xtNum2'键入20并按"tnAdd'",则总和的值将表示在"xtAnswer"中。

(我会提供表格的图片,但我需要在这个网站上至少获得10个信誉点,所以提前道歉)

我在表格上遇到的问题有:;-我只能在一个文本框中输入值(使用鼠标+屏幕上的可用按钮)。我尝试过使用布尔值来检查"Focus"是否已设置为特定框,然后从那里开始,但我完全不知道下一步该怎么办。我的讲师实际上建议我使用这个布尔方法来帮助解决这个问题。

非常感谢任何建议+如果你们能教我一种更好的方法来表示我的代码,也许可以通过使用函数等来减少数量,我将不胜感激。我一直热衷于学习新的技巧和窍门。

这是源代码:

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;
        }
    }
}

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

布尔值将像您所描述的那样工作。当用户点击任一文本框时,只需标记即可:

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

现在,如果ff为false,则需要写入txtNum1;如果ff为true,则要写入txtNum2

对于数字按钮,我会写一个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;       
}

假设每个按钮的文本只是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);
}

我建议使用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的观点,即应该对代码进行抽象以提高可重用性。