';简单';计算器-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;
}
}
}
布尔值将像您所描述的那样工作。当用户点击任一文本框时,只需标记即可:
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;
}
假设每个按钮的文本只是1
、2
等。
在试图减少代码的过程中,您可以看到每个操作的功能几乎相同,只有一行除外。这是一个可以重构的好迹象:
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的观点,即应该对代码进行抽象以提高可重用性。