我正在研究一个试图计算给定数字绝对值的程序。我的代码有几个部分。第一部分通过监视数字上下框来检查等式是一个还是两个术语。如果是一个术语,则只显示一个输入框,并将名为p.choice的公共变量设置为1.但是,如果是两个术语,则会出现两个输入框,p.choice设置为2.当用户单击时go按钮,程序检查p.choice是否等于1或2(我稍后会添加一个例外0)。我还没有2的功能。但是如果p.choice等于1,它会运行一个名为calculate1()的函数。此函数根据从第一个文本框中选取的公共变量检查该变量是正还是负。如果它是负面的,那就是积极的。然后它返回该变量。这是我的整个类的代码(没有从另一个类调用)
public partial class Form1 : Form
{
private int calculate1()
{
Form1 p = new Form1();
if (p.box1 < 0)
{
p.box1 = p.box1 * -1;
}
return p.box1;
}
public int choice;
public int box1;
public int box2;
public Form1()
{
InitializeComponent();
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
Form1 p = new Form1();
decimal changeValue = numericUpDown1.Value;
changeValue = Convert.ToInt32(changeValue);
if (changeValue == 1)
{
textBox1.Visible = true;
textBox2.Visible = false;
p.choice = 1;
}
else if (changeValue == 2)
{
textBox1.Visible = true;
textBox2.Visible = true;
p.choice = 2;
}
else
{
textBox1.Visible = false;
textBox2.Visible = false;
p.choice = 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
Form1 p = new Form1();
if (p.choice == 1)
{
//p.box1 = Convert.ToInt32(textBox1.Text);
//p.box1 = calculate1();
//string result = "The Answer Is " + p.box1;
//label2.Text = "5";
//MessageBox.Show("Answer!", result, MessageBoxButtons.OK);
label2.Text = "Hello World";
}
else if (p.choice == 2)
{
p.box1 = Convert.ToInt32(textBox1.Text);
p.box2 = Convert.ToInt32(textBox2.Text);
}
}
}
我的问题出现在点击按钮上。什么都没发生,我知道这意味着p.choice没有被设置为等于任何东西,因为我还没有else子句。但是,当我在数字框中选择1并输入一个值时,我似乎无法弄清楚为什么p.choice没有被设置为1。在之前的编辑中,我尝试将label2.text =设置为将p.choice转换为int32。当我更改了盒子编号时,标签会随盒子编号正确更改。所以我知道这个数字是在代码的这一部分注册的。我无法弄清楚为什么它不能在下一部分工作。如果有人可以帮助我,我会非常感激。
答案 0 :(得分:3)
p.choice
始终为零,因为您在每个函数中都保持实例化一个新的Form1
对象。
这一行:
Form1 p = new Form1();
调用Form1
类的构造函数,该类将字段choice
(int
)设置为其默认值零。
因此,当您在条件逻辑中检查p.choice
的值时,if
或else if
都不成立:
// This is false, because p.choice is zero
if (p.choice == 1)
// This is false, because p.choice is zero
else if (p.choice == 2)
您不需要创建该类的新实例,因为您已经在其中。
删除此行:
Form1 p = new Form1();
而是使用this
,这是对类实例的引用,如下所示:
private void button1_Click(object sender, EventArgs e)
{
if (this.choice == 1)
{
//this.box1 = Convert.ToInt32(textBox1.Text);
//this.box1 = calculate1();
//string result = "The Answer Is " + this.box1;
//label2.Text = "5";
//MessageBox.Show("Answer!", result, MessageBoxButtons.OK);
label2.Text = "Hello World";
}
else if (this.choice == 2)
{
this.box1 = Convert.ToInt32(textBox1.Text);
this.box2 = Convert.ToInt32(textBox2.Text);
}
}