我有10个表单,每个表单都有下一个和上一个按钮。显示和关闭表单的最佳方法是什么。我不需要表格留在记忆中。 有什么想法吗?
答案 0 :(得分:1)
我会使用类似于FormSwitcher的东西:
public class FormSwitcher
{
private List<Func<Form>> constructors;
private int currentConstructor = 1;
public FormSwitcher(Func<Form> firstForm)
{
constructors = new List<Func<Form>>();
AddForm(firstForm);
}
public void AddForm(Func<Form> constructor)
{
constructors.Add(constructor);
}
public Form GetNextForm()
{
if (constructors.Count > 0 && currentConstructor >= constructors.Count)
{
currentConstructor = 0;
}
if (constructors.Count > currentConstructor)
{
return constructors[currentConstructor++]();
}
return null;
}
}
您的主要表单应如下所示:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new FirstForm().Show();
}
}
旋转形式可能如下所示:
public partial class FirstForm : Form
{
private FormSwitcher switcher;
public FirstForm()
{
InitializeComponent();
switcher = new FormSwitcher(() => new FirstForm());
switcher.AddForm(() => new SecondForm(switcher));
switcher.AddForm(() => new ThirdForm(switcher));
}
private void button1_Click(object sender, EventArgs e)
{
switcher.GetNextForm().Show();
Close();
}
}
public partial class SecondForm : Form
{
private FormSwitcher switcher;
public SecondForm(FormSwitcher switcher)
{
InitializeComponent();
this.switcher = switcher;
}
private void button1_Click(object sender, EventArgs e)
{
switcher.GetNextForm().Show();
Close();
}
}
public partial class ThirdForm : Form
{
private FormSwitcher switcher;
public ThirdForm(FormSwitcher switcher)
{
InitializeComponent();
this.switcher = switcher;
}
private void button1_Click(object sender, EventArgs e)
{
switcher.GetNextForm().Show();
Close();
}
}
答案 1 :(得分:1)
不要这样做。 有一个表单,十个用户控件,最好是实现接口的表单。
尽可能多地从表格中取出代码,一切都很好...... 现在点击抽象按钮,否则你的下一个版本将有表单3检查表1,看看你是否可以在返回边缘情况634时跳过表单2,而如果你从1转发转发你可以跳过2同样,除非他们勾选方框14并在方框8中加上“弗雷德”。
这不是你想穿的tereshirt。
答案 2 :(得分:0)
我会为每个窗口使用单独的引用,如果您不再需要它,可以将其设置为null。当没有任何引用指向对象时,垃圾收集器会在一段时间后将其称为析构函数。
如果我做得对,你有一些窗户,比如n个窗户,它们可以做一段时间的工作,然后不再需要了。所以当你写
Window myWindow_1 = new Windowd ();
Window myWindow_2 = new Windowd ();
Window myWindow_3 = new Windowd ();
// ...
Window myWindow_n = new Windowd ();
如果你想让他们留下记忆你就可以做到
myWindow1 = null;
myWindow2 = null;
myWindow3 = null;
//...
myWindow4 = null;
如果这些是用于链接到Window对象的唯一引用,它们将在内存中保留为不可引用的ghost,并且垃圾收集器将在一段时间后将其删除。
为简单起见,您可以将所有这些引用保存在数组中,以避免为每个对象指定名称。对于exapmle:
Window[] myWindows = new Window[n];
for (int i=0; i<n; i++) {
myWindows[i] = new Window();
}
希望这会有所帮助:)