C# 窗体不可见时丢失的值

C# 窗体不可见时丢失的值,c#,winforms,C#,Winforms,我正在做一个简单的向导。我创建了一个用于保存表单的静态类: namespace LABEL_AUTOMATION { static class ProjectHelper { public static Form1 frm1 = new Form1(); public static Form2 frm2 = new Form2(); } } 对于form1的“下一步”按钮,

我正在做一个简单的向导。我创建了一个用于保存表单的静态类:

    namespace LABEL_AUTOMATION
    {
        static class ProjectHelper
        {
            public static Form1 frm1 = new Form1();
            public static Form2 frm2 = new Form2();
        }

    }
对于form1的“下一步”按钮,我有以下代码:

 private void buttonNext_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        ProjectHelper.frm2.Visible = true;
    }
和form2的后退按钮的类似逻辑:

private void buttonPrevious_Click(object sender, EventArgs e)
{
    this.Visible = false;
    ProjectHelper.frm1.Visible = true;
}
问题是,当我在表单之间移动时,像textbox这样的控件的值会被清除

如何纠正

此外,当用户在表单之间切换时,我使用表单的visible changed事件来执行代码。但是,在窗体可见之前触发事件。还有其他我可以使用的事件吗

编辑:我实际上没有更改Program.cs文件,该文件实际上是在创建和运行一个单独的Form1实例。因此,我将代码更改为:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ProjectHelper.frm1.Show();
}  
但它给出了以下错误:

The type initializer for 'LABEL_AUTOMATION.ProjectHelper' threw an exception.

我不知道这个问题,但我认为,在使其不可见之前,可以将所有值保存在一些变量中,并在窗体再次可见时加载此设置

我不知道这个问题,但我认为,您可以将所有值保存在某些变量中,然后使其不可见,并在窗体再次可见时加载此设置

我认为您正在显示/隐藏不在
ProjectHelper
类中的窗体实例

你基本上应该这样做

ProjectHelper.frm1.Show();


我认为您正在显示/隐藏不在
ProjectHelper
类中的表单实例

你基本上应该这样做

ProjectHelper.frm1.Show();


为了解决清除控件的问题,我将创建一个简单的POCO类来保存数据,并使用数据绑定将控件绑定到POCO类实例。这样,您在表单上输入的所有数据都会自动保存在POCO类中,当表单再次显示时,值也会再次出现


关于可见的已更改事件-一个选项是创建自己的事件,并在表单中激发该事件。然后,您可以创建一个基类来自动触发事件。在这个可见的已更改事件处理程序中,您到底在做什么?

为了解决清除控件的问题,我将创建一个简单的POCO类来保存数据,并使用数据绑定将控件绑定到POCO类实例。这样,您在表单上输入的所有数据都会自动保存在POCO类中,当表单再次显示时,值也会再次出现


关于可见的已更改事件-一个选项是创建自己的事件,并在表单中激发该事件。然后,您可以创建一个基类来自动触发事件。在这个可见的已更改事件处理程序中,您到底在做什么?

您必须将值保存在外部类中,或者在值更改时在两个formelements中填充值

您可以在controlelement中使用事件
TextChanged
ValueChanged
,然后以其他形式设置值。 或者使用外部类,在其中设置值,每次切换时,必须从外部类重新加载值


提示:我不会使用多个表单。只需使用一个表单和一些面板,并将它们设置为可见或不可见。

您必须将值保存在外部类中,或者在值更改时将值填充到两个表单元素中

您可以在controlelement中使用事件
TextChanged
ValueChanged
,然后以其他形式设置值。 或者使用外部类,在其中设置值,每次切换时,必须从外部类重新加载值


提示:我不会使用多个表单。只需使用一个表单和一些面板,并将它们设置为可见或不可见。

我建议创建一个表单,并为向导中的每个步骤创建一个
UserControl
。然后,表单管理面板的可见性,并可以处理(或触发)事件

这样你就不需要静力学,可以完全控制你的生命;和向导步骤中的数据


其次,为每个向导步骤创建一个自定义类(数据持有者),并使用windows窗体数据绑定将UI控件(和验证)数据绑定到数据持有者。这样,您就不需要在向导步骤上进行事件处理来保存数据,向导本身将成为一个简单的视图。

我建议制作一个表单,并为向导中的每个步骤制作一个
UserControl
。然后,表单管理面板的可见性,并可以处理(或触发)事件

这样你就不需要静力学,可以完全控制你的生命;和向导步骤中的数据


其次,为每个向导步骤创建一个自定义类(数据持有者),并使用windows窗体数据绑定将UI控件(和验证)数据绑定到数据持有者。这样,您就不需要在向导步骤上进行事件处理来保存数据,向导本身将成为一个简单的视图。

您完全正确!我按照你的建议更改了密码,但它显示出一个错误。请看我原始问题中的更新。你完全正确!我按照你的建议更改了密码,但它显示出一个错误。请在我的原始问题中查看我的更新。您看到引发的异常了吗?您看到引发的异常了吗?