在c#中切换多个窗口表单

时间:2012-01-12 17:35:50

标签: c# windows forms

我有10个表单,每个表单都有下一个和上一个按钮。显示和关闭表单的最佳方法是什么。我不需要表格留在记忆中。 有什么想法吗?

3 个答案:

答案 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();
}

希望这会有所帮助:)