窗体内的静态成员

本文关键字:静态成员 窗体 | 更新日期: 2023-09-27 18:01:36

在我的项目上的WindowsForms,如果我有一个静态实例内的形式,当我在第一次打开我的形式,它的工作。但是如果我关闭它再打开它,表单将是空的。为什么会这样呢?

public partial class Computer : Form
    {
        static Indicators indicators = new Code.Indicators();
    }

注:我将其设置为静态,因为我想在窗体关闭后保存它的值

编辑1:打开表单
private void button3_Click(object sender, EventArgs e)
        {
            Computer computer = new Computer();
            computer.ShowDialog();
        }

编辑2:Computer Form

namespace WF
{
    public partial class Computer : Form
    {
        static Code.Indicators indicators = new Code.Indicators();
        public Computer()
        {
            if (indicators.isComputerAlreadyRunning == false)
            {
                InitializeComponent();
                pictureBox1.Image = Properties.Resources.Computer1;
                indicators.isComputerAlreadyRunning = true;
            }
        }
        // My not successful try to save the value of the variable
        public Code.Indicators ShowForm()
        {
            return new Code.Indicators(indicators.isComputerAlreadyRunning);
        }
    }
}

窗体内的静态成员

我不认为静态成员在Windows窗体生命周期中工作得很好。

我建议您使Indicators成为您表单的正常实例成员。要在窗体生命周期之外保留状态,可以从窗体中复制状态,并在打开窗体时将其复制回窗体。

// Keep this in the proper place 
var indicators = new Code.Indicators();
...
// Copy back and forth for the life time of the form
using (var form = new Computer())
{
    form.Indicators.AddRange(indicators);
    form.Close += (s, e) => 
        {
            indicators.Clear();
            indicators.AddRange(form.Indicators);
        }
}
...

根据Computer类中的构造函数,indicators.isComputerAlreadyRunning在第一次创建表单时被设置为true。

因此,当第二次创建Computer时,if条件将失败,整个if块将被跳过。这意味着您的InitializeComponent();不会运行,因此表单中的任何内容都不会显示。

InitializeComponent();放在if子句之外以使其工作