2012-01-12 10 views
1

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

+1

Я бы использовал что-то другое, кроме форм. Почему бы не изменить пользовательский интерфейс, чтобы использовать одну форму с несколькими панелями (или что-то подобное)? – webdad3

+0

После этого будет трудно прочитать код. Это огромный проект. – McDee

+0

@McDee - Концепция, которую вы описываете здесь, обычно называется «Мастером», и есть несколько хороших обучающих программ, которые описывают правильные реализации «Мастера». Вот один из них: http://geekswithblogs.net/jannikanker/archive/2005/03/14/55193.aspx –

ответ

0

Я бы использовал отдельную ссылку для каждого окна, которую вы можете установить на нуль, если она вам больше не понадобится. Когда нет никакой ссылки, которая указывает на объект, сборщик мусора будет называть его деструктором через некоторое время.

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

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

Window[] myWindows = new Window[n]; 

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

    myWindows[i] = new Window(); 
} 

Надежда это помогает :)

+0

Пример кода действительно поможет ... спасибо – McDee

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(); 
    } 
} 
+0

ok попробует это ... какое пространство имен делает Список > должен иметь? – McDee

+0

Список <> - из System.Collections.Generic, Func <> из системы –

1

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

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

Это не teeshirt, которую вы хотите носить.

Смежные вопросы