2013-06-25 2 views
1

Я просмотрел все предлагаемые ответы и ничего не похоже на то, что я ищу. Я хочу вызвать вторую форму из моей основной формы, скрыть свою основную форму, пока активна вторая форма, а затем отобразить основную форму, когда вторая форма закрывается. В основном я хочу «переключать» между двумя формами.Скрыть форму, перейти ко второй форме, закрыть вторую форму и показать первую форму

До сих пор у меня есть:

В моей главной форме:

private void countClick(object sender, EventArgs e) 
{ 
    this.Hide(); 
    subForm myNewForm = new subForm(); 
    myNewForm.ShowDialog(); 
} 

и в моей второй форме у меня есть:

private void totalClick(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

Как получить основную форму, чтобы показать?

ответ

0

Если вы работаете в том же пространстве имен, у вас есть контекст, используя mainform или имя, которое вы дали «основной формы», попробуйте:

mainform.show(); 
+1

Что такое 'mainform'? Где это определено? Где это следует вставить? Пожалуйста, укажите больше контекста. – Chris

0

Вам нужно найти какой-то способ передать ссылку к основной форме во второй обработчик события клика формы.

Вы можете сделать это, установив форму как переменную-член второго класса формы или передав ее через аргументы события.

2

ShowDialog открывает вашу вторичную форму как модальный диалог, что означает, что выполнение кода MainForm прекратится в этой точке, и ваша вторичная форма будет иметь фокус. поэтому все, что вам нужно сделать, это поставить this.Show после вызова ShowDialog.

Из выше ссылки:

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

private void countClick(object sender, EventArgs e) 
{ 
    this.Hide(); 
    subForm myNewForm = new subForm(); 
    myNewForm.ShowDialog(); 
    this.Show(); 
} 
+0

Я бы добавил только одно предостережение ... если текущая форма также является модальным диалогом, и вы скрываете ее ... разве это не убивает модальность? Если это так, я бы просто предложил сохранить верхнюю или левую позицию окна, установить его на что-то вроде -2000, а затем установить его обратно, когда другая форма закрывается. – DRapp

+0

@DRapp Поскольку он упомянул, что он звонит из своего MainForm, скорее всего, в моем сознании, это будет основной формой его программы. Таким образом, сценарий, который вы описываете, маловероятен. Кроме того, запуск быстрого теста, генерирующего другое окно Modal Dialog из вторичной формы, не нарушил модальность. –

+0

Если модальный диалог не является тем, что вы хотите, вы всегда можете вызвать myNewForm.Show (это), а затем иметь ссылку на форму в качестве родителя, где вы можете позвонить show/hide – Mataniko

1

Скажем, в Form1 нажатии на кнопку, чтобы показать Form2

Form2 frm2 = new Form2(); 
frm2.Activated += new EventHandler(frm2_Activated); // Handler when the form is activated 
frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); // Hander when the form is closed 
frm2.Show(); 

Теперь это одно, когда Form2 показывается или Activated скрыть форму вызова, в этом случае Form1

private void frm2_Activated(object sender, EventArgs e) 
    { 
     this.Hide(); // Hides Form1 but it is till in Memory 
    } 

Form2 Тогда, когда это Closed будет UnhideForm1.

private void frm2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.Show(); // Unhide Form1 
    } 
1

Это сложно сделать правильно. Проблема в том, что вы должны избегать отсутствия окна, которое может получить фокус. Диспетчер окон Windows будет вынужден найти другое окно, в котором вы сможете сосредоточиться. Это будет окно другого приложения. После этого ваше окно исчезнет.

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

Так что вам нужно сделать, это скрыть ваше окно после отображать диалоговое окно и показать его снова перед диалоговое окно закроется. Это требует трюков. Они выглядят так:

private void countClick(object sender, EventArgs e) 
{ 
    this.BeginInvoke(new Action(() => this.Hide())); 
    using (var dlg = new subForm()) { 
     dlg.FormClosing += (s, fcea) => { if (!fcea.Cancel) this.Show(); }; 
     if (dlg.ShowDialog() == DialogResult.OK) { 
      // etc... 
     } 
    } 
} 

вызова BeginInvoke() является трюком, чтобы получить код для запуска после прогонов методы ShowDialog(). Таким образом, ваше окно будет скрыто после отображения диалогового окна. Событие FormClosing диалогового окна используется для того, чтобы окно стало видимым снова перед закрытием диалогового окна.