所以我刚刚制作了一个由按钮和文本框(tbxSum)组成的基本小计算器。
我遇到的问题是,如果输入了无效的总和,我希望我的catch块能够接收它(它确实如此)并用最新的结果替换文本框中的内容。计算器(它没有)。
所以说我说:
3 + 3 = 6
我的计算器现在将6放在文本框中,用于下一笔款项。
然后说我做了:
6 // 3
计算器选择它是无效的,但我希望文本框值从前一个总和返回到6。
这是我尝试过的:
var myButton = (Button)sender;
if (myButton.Content.ToString() == "=")
{
DataTable dt = new DataTable();
string s = tbxSum.Text;
string result = "";
if (s.Contains("("))
{
s = s.Replace("(", "*(");
}
try
{
var v = dt.Compute(s, "");
tbkSum.Text = s + "=" + v.ToString();
tbxSum.Text = v.ToString();
}
catch
{
MessageBox.Show("Invalid Sum");
tbxSum.Text = result;
}
}
我还有一个文本块(tbkSum),它显示了前一个总和,所以我想也许我可以把等号右边的所有内容都拿走,但我不知道该怎么做。
答案 0 :(得分:3)
class Calculate(){
private boolean lastGoodValueSet = false;
private int lastGoodValue = 0;
void buttonFunction(){
if (myButton.Content.ToString() == "=")
{
//Your code
try
{
var v = dt.Compute(s, "");
tbkSum.Text = s + "=" + v.ToString();
lastGoodValue = v;
lastGoodValueSet = true;
}
catch
{
MessageBox.Show("Invalid Sum");
tbxSum.Text = result;
if (lastGoodValueSet)
tbxSum.Text = lastGoodValue;
}
}
}
}
这是您可以使用的一组示例代码,它是一个简单的值,您必须存储以表明是否已经完成了良好的计算,如果是这样的话,在错误点我们想要回到计算。希望有所帮助!您希望向用户提供某种消息,因此他们知道存在错误。
我们必须这样做,因为在用户按下等号按钮时,tbkSum
内的值已经改变,我们需要在用户更改值之前,所以抓住的最佳时间它是在我们在成功计算时更新tbkSum
文本值
这也假设您每次进行计算时都不会创建Calculate
类的新实例。否则,您需要将号码存储在其他地方
修改强>
解决此问题的另一种方法是首先防止重复,我从您的其他注释中读到,您可以通过应用程序上的按钮控制文本框中的内容。假设所有按钮都使用buttonFunction()
的相同方法,那么你可以这样做:
private char[] buttonChars = {'/','*', '+'/*e.t.c*/}
void buttonFunction(){
string buttonPressedStr = myButton.Content.ToString();
char buttonPressed = buttonPressedStr[0];
int pos = Array.IndexOf(buttonChars , buttonPressed);
if (pos > -1)
{
if (tbxSum.Text.Length > 0){
char last = tbxSum.Text[tbxSum.Text.Length - 1];
pos = Array.IndexOf(buttonChars , last);
}
else
pos = 0;
if (pos > -1){
tbkSum.Text += buttonPressedStr;
}
}
有更简洁的方法可以做到这一点,但它是一个例子,说明如何首先阻止您的问题。一些解释:
buttonChars
是您的不同按钮类型的数组,它们将附加到框中的文本中,例如+, - 等等buttonChars
tbxSum
的最后一件事是tbxSum
数组中再次找到添加到buttonChars
的最后一件事,我们就不想附加字符串tbxSum
为空或者最后有另一个角色,我们可以附加我们的角色答案 1 :(得分:2)
您可以将旧值存储在try块的外变量中,并再次在catch块中使用此变量:
string oldSumValue = tbxSum.Text;
try
{
// your code
}
catch
{
tbxSum.Text = oldSumValue ;
MessageBox.Show("Invalid Sum");
}
答案 2 :(得分:1)
或者我提出这个以防止出现:
A)重复'*'或'/'
B)以'*'或'/'
开头的总和public MainWindow()
{
InitializeComponent();
if (tbxSum.Text == "")
{
btnDiv.IsEnabled = false;
btnMult.IsEnabled = false;
}
}
protected void btnSumClick(object sender, EventArgs e)
{
btnDiv.IsEnabled = true;
btnMult.IsEnabled = true;
var myButton = (Button)sender;
int pos = tbxSum.Text.Length;
if (pos > 0)
{
if ((tbxSum.Text[pos - 1] == '/' || tbxSum.Text[pos - 1] == '*') &&
(myButton.Content.ToString() == "/" || myButton.Content.ToString() == "*"))
{
int location = tbxSum.Text.Length - 1;
tbxSum.Text = tbxSum.Text.Remove(location, 1);
}
}
}