所以我刚刚做了一个由按钮和文本框(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),它显示了前面的和,所以我想,也许我可以把所有的东西都放在等号的右边,但是我不知道怎么做。
发布于 2016-05-19 11:27:12
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为空或末尾有另一个字符,则可以追加字符。发布于 2016-05-19 11:13:07
可以将旧值存储在try块之外的变量解密中,并在catch块中再次使用该变量:
string oldSumValue = tbxSum.Text;
try
{
// your code
}
catch
{
tbxSum.Text = oldSumValue ;
MessageBox.Show("Invalid Sum");
}发布于 2016-05-20 09:17:10
或者,我想出了这个方法来防止这样的情况发生:
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);
}
}
}https://stackoverflow.com/questions/37321465
复制相似问题