Переключение между несколькими формами окон в C # - PullRequest
1 голос
/ 12 января 2012

У меня есть 10 форм, и каждая форма имеет кнопки Next и Previous. Каков наилучший подход к показу и закрытию форм. Мне не нужны формы, чтобы остаться в памяти. Есть идеи?

Ответы [ 3 ]

1 голос
/ 12 января 2012

Я бы использовал что-то похожее на 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 голос
/ 12 января 2012

Не делай этого.Имейте одну форму, десять пользовательских элементов управления, предпочтительно те, которые реализуют интерфейс.

Вынимайте из форм как можно больше кода, все хорошо ... Нажмите абстрактную кнопку сейчас, иначе следующая версияу вас будет форма 3, проверьте форму 1, чтобы увидеть, можете ли вы пропустить форму 2, возвращаясь в крайнем случае 634, при этом помните, что если вы все-таки идете вперёд от 1, вы также можете пропустить 2, если только они не отмечены галочкой 14положите «Фред» в коробку 8.

Это не футболка, которую вы хотите надеть.

0 голосов
/ 12 января 2012

Я бы использовал отдельную ссылку для каждого окна, которую вы можете установить в 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, они останутся в памяти как не ссылающиеся призраки, и сборщик мусора удалит их через некоторое время.

Для простоты вы можете хранить все эти ссылки в массиве, чтобы избежать присвоения каждому объекту имени. Например:

Window[] myWindows = new Window[n];

for (int i=0; i<n; i++) {

    myWindows[i] = new Window();
}

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...