我正在制作一个简单的向导。我创建了一个用于保存表单的静态类:
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.
答案 0 :(得分:2)
为了解决清除控件的问题,我将创建一个简单的POCO类来保存数据,并使用数据绑定将控件绑定到POCO类实例。这样,表单上输入的所有数据都会自动保存在POCO类中,当再次显示表单时,值会再次出现。
关于您的可见变更事件 - 一个选项是创建您自己的事件,并在表单中触发。然后,您可以创建一个自动触发事件的基类。你究竟在这个可见变化的事件处理程序中做了什么?
答案 1 :(得分:1)
我认为您正在显示/隐藏不在ProjectHelper
类中的表单实例。
你应该在Main做
ProjectHelper.frm1.Show();
或
ProjectHelper.frm2.Show();
答案 2 :(得分:0)
我不知道这个问题,但我认为,您可以在隐藏某些变量之前保存所有值,并在表单再次可见时加载此设置
答案 3 :(得分:0)
您必须将值保存在外部类中,或者在值更改时填充两个formelements中的值。
您可以在控制元素中使用事件TextChanged
或ValueChanged
,然后以其他形式设置值。
或者使用外部类,在那里设置值,每次切换时,都必须从外部类重新加载值。
提示:我不会使用多个表格。只需使用一个表格和一些面板,并将它们设置为可见或不可见。
答案 4 :(得分:0)
我建议制作一个表单,并为向导中的每个步骤创建一个UserControl
。然后,您的表单管理面板的可见性,并可以处理(或触发)事件。
这样你就不需要静力学,可以完全控制生命;和向导步骤中的数据。
其次,为每个向导步骤创建一个自定义类(数据持有者),并使用Windows窗体数据绑定将UI控件(和验证)数据绑定到数据持有者。这样,您无需在向导步骤中执行事件处理来保存数据,向导本身也将变为简单视图。