【问题标题】:Variable is being reset and im not sure why? c#变量正在被重置,我不确定为什么? C#
【发布时间】:2016-04-20 17:57:12
【问题描述】:

我正在单击一个按钮来隐藏一个窗口并打开另一个窗口。

private void gamemodButton_Click(object sender, EventArgs e)
{
    background.moduleNumber = 1;
    this.Hide();
    moduleScreen showForm = new moduleScreen();
    showForm.Show();
    MessageBox.Show(background.moduleNumber.ToString()); //for checking that the variable was applied
}

标签的文本属性将根据单击的按钮在新表单中发生变化。这是通过根据单击的按钮为公共变量分配一个值来完成的。

public class backgroundProgram
{
    public int moduleNumber;
}

这是根据变量改变标签上文本的代码:

private void moduleScreen_Shown(Object sender, EventArgs e)
{
    switch (background.moduleNumber)
    {
        case 1:
            moduleLabel.Text = "Game Design 1 - CGP1005M";
            break;
        case 2:
            moduleLabel.Text = "Algorithms and Complexity - CMP 1124M";
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            break;
        default:
            MessageBox.Show("Nope");
            break;
    }
}

到目前为止,变量 background.moduleNumber 在进入 switch/case 之前被重置为 0,所以我每次只能返回默认 case。有什么想法吗?

编辑:刚刚向变量添加了一个监视,它在这一行被擦除。

  private System.ComponentModel.IContainer components = null;

这在moduleScreen.Designmer.cs中

显示我的新 backgroundProgram() 的代码;位置

namespace ModNote
{
public partial class moduleScreen : Form
{
    static backgroundProgram background = new backgroundProgram();
    public moduleScreen()
    {

        InitializeComponent();
        Shown += moduleScreen_Shown;
    }

    public void moduleScreen_Shown (Object sender, EventArgs e)
    {

        switch (background.moduleNumber)
        {
            case 1:
                moduleLabel.Text = "Game Design 1 - CGP1005M";
                break;
            case 2:
                moduleLabel.Text = "Algorithms and Complexity - CMP 1124M";
                break;
            case 3:
                break;
            case 4:
                break;
            case 5:
                break;
            case 6:
                break;
            case 7:
                break;
            default:
                MessageBox.Show("Nope");
                break;
        }


        }

} }

【问题讨论】:

  • moduleScreen WinForm 如何接收backgroundProgram 对象?有这样的静态实例吗?我看不出代码有任何问题。
  • 是:静态背景程序背景=新背景程序();
  • 这是在什么类中定义的?它必须只在一个中定义。如果moduleScreen_Show()gamemodeButton_Click() 在不同的类中,则对该静态变量的访问应该类似于SomeClass.background.moduleNumber。它重置为零的事实听起来就像您正在重新创建该对象并且它获得默认的 int 值 (0)。
  • 我仍然不确定表单的更改如何重置 background.moduleNumber 值?
  • 给变量加一个watch,当值改变时让它中断

标签: c# winforms


【解决方案1】:

不完全可以从给定的代码中说出来,但从我看来,每次按下按钮时你都在创建一个新的 moduleScreen

【讨论】:

    【解决方案2】:

    从 cmets 和帖子中我推断您有这样的情况:

    public partial class MainForm : Form
    {
        static backgroundProgram = new backgroundProgram(); //first declaration
    
        private void gamemodButton_Click(object sender, EventArgs e)
        {
            backgroundProgram.moduleNumber = 1;
            //rest..
        }
    }
    

    然后在另一个班级

    public partial class moduleScreen : Form
    {
        static backgroundProgram = new backgroundProgram(); //second declaration
    
        public void moduleScreen_Shown (Object sender, EventArgs e)
        {
           switch(backgroundProgram.moduleNumber) 
           {
              //...
           }
        }
    }
    

    然而,尽管变量已被声明为static,但每个类都为自己拥有一个不同对象的静态实例。在MainFormmoduleScreen 中,您指的是“backgroundProgram”,从这两个类的角度来看,它们是不同的对象。您必须将对象从一个 Form 传递给另一个对象,或者您可以只使用一个单独的类,在其中从一开始就声明属性 static

    传递参考如下:

    public partial class MainForm : Form
    {
        static backgroundProgram = new backgroundProgram(); //first declaration
    
        private void moduleScreen_Shown(Object sender, EventArgs e)
        {
            backgroundProgram.moduleNumber = 1;
            moduleScreen showForm = new moduleScreen();
            showForm.backgroundProgram = backgroundProgram; //give it this object
            //rest..
        }
    }
    
    public partial class moduleScreen : Form
    {
        public backgroundProgram; //no initialization. null from the beginning, set later.
    
        public void moduleScreen_Shown (Object sender, EventArgs e)
        {
           switch(backgroundProgram.moduleNumber) 
           {
              //...
           }
        }
    }
    

    或者,使用静态字段:

    public class BackgroundProgram
    {
        public static int moduleNumber; 
    }
    
    public partial class moduleScreen : Form
    {
        //no own static fields of that object
        public void moduleScreen_Shown (Object sender, EventArgs e)
        {
           switch(BackgroundProgram.moduleNumber) //Refer to the static field of that class
           {
              //...
           }
        }
    }
    

    在其他类中:

        private void gamemodButton_Click(object sender, EventArgs e)
        {
            BackgroundProgram.moduleNumber = 1; //Refer to that same static field.. 
            //..
        }
    

    【讨论】:

      猜你喜欢
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多