当表单变得不可见时,值会丢失

时间:2012-08-20 07:26:19

标签: c# winforms

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

    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;
}

问题是当我在表单之间移动时,像文本框这样的控件的值会被清除。

如何纠正?

此外,当用户在表单之间切换时,我正在使用表单的可见更改事件来执行代码。但是,事件在表单可见之前被触发。我可以使用的任何其他事件?

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

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ProjectHelper.frm1.Show();
}  

但它出现以下错误:

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

5 个答案:

答案 0 :(得分:2)

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

关于您的可见变更事件 - 一个选项是创建您自己的事件,并在表单中触发。然后,您可以创建一个自动触发事件的基类。你究竟在这个可见变化的事件处理程序中做了什么?

答案 1 :(得分:1)

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

你应该在Main做

ProjectHelper.frm1.Show();

ProjectHelper.frm2.Show();

答案 2 :(得分:0)

我不知道这个问题,但我认为,您可以在隐藏某些变量之前保存所有值,并在表单再次可见时加载此设置

答案 3 :(得分:0)

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

您可以在控制元素中使用事件TextChangedValueChanged,然后以其他形式设置值。 或者使用外部类,在那里设置值,每次切换时,都必须从外部类重新加载值。

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

答案 4 :(得分:0)

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

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

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