1

我正在研究一个试图计算给定数字的绝对值的程序。我的代码有几个部分。第一部分通过监视数字上下框来检查方程是一项还是两项。如果是一个词条,只会出现一个输入框,一个叫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。当我更改箱号时,标签与箱号正确更改。所以我知道在这部分代码期间该号码正在注册。我只是无法弄清楚为什么它在下一部分中不起作用。如果有人可以帮助我,我将不胜感激。

4

1 回答 1

3

p.choice始终为零,因为您不断Form1在每个函数中实例化一个新对象。

这一行:

Form1 p = new Form1();

调用Form1类的构造函数,它将字段choice(an int) 设置为其默认值零。

因此,当您检查p.choice条件逻辑中的值时,iforelse 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);
    }
}
于 2013-09-26T03:00:40.580 回答