为了给你一些编程背景,我是软件工程专业的第一年(本学年开始)。我已经编程了一年中最好的部分,主要是使用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;
}
}
}
答案 0 :(得分:2)
布尔值将像你描述的那样工作。只需在用户点击任一文本框时标记它:
private void txtNum1_Click(object sender, EventArgs e)
{
ff = false;
}
private void txtNum2_Click(object sender, MouseEventArgs e)
{
ff = true;
}
现在,如果ff
为false,您希望写入txtNum1
,txtNum2
如果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的文字只是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);
}
答案 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您应该努力抽象代码以提高可重用性。