2010-01-12 11 views
4

Я могу получить свою первую форму под названием «FieldReprogrammingSoftware», чтобы закрыть и другую форму под названием «Настройка», чтобы открыть, используя следующий код.Как закрыть текущую форму, а затем открыть главный в C#?

  Setup fh = new Setup(); 
      fh.Show(); 
      this.Hide(); 

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

Название «FieldReprogrammingSoftware» не существует в текущем контексте

Любые идеи?

Пожалуйста, имейте в виду, что я являюсь noob для C#.

NVM, я только что узнал, что для этого продукта, это нормально, чтобы иметь FieldReprogrammingSoftware форма остается открытой, а Setup формы так я теперь только с помощью

 Setup fh = new Setup(); 
     fh.Show(); 

на FieldReprogrammingSoftware формы и

this.close() 

на форме настройки. Богу это было гораздо легче сделать в VB

И пространство имен для обеих форм - это FieldUpdate, что и называется моим решением.

+0

Программное обеспечение FieldProgrammingSoftware не существует в текущем пространстве имен. – 2010-01-12 19:54:07

ответ

4

В форме настройки вы можете использовать это:

private void button1_Click(object sender, EventArgs e) 
{ 
    Application.OpenForms[0].Show(); 
    this.Hide(); // or this.Close(); 
} 

это покажет первый снова форму. «0» - это индекс основной формы приложения.

+1

Это будет работать, только если его MainForm действительно был первым элементом в коллекции. Это может быть справедливым допущением при нормальных обстоятельствах, но вы не всегда можете это гарантировать. – BenAlabaster

+0

Im, предполагая по названию своего вопроса, что «основной» является начальной формой. – Inisheer

+0

он мог бы подумать, что это его первоначальная форма, но она не решает проблему, когда ее не первая форма в списке. –

0

Следуйте за своим сердцем, позвольте сообщению об ошибке быть вашим проводником.

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

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

Если вы не намеренно добавляете новое пространство имен в свой код, что не похоже на то, что вы делаете, просто убедитесь, что оба совпадения (или оба имеют хотя бы пространство имен). В противном случае добавьте новое пространство имен или щелкните в конце объекта, на который вы не получите intellisense, и нажмите Ctrl., чтобы узнать, сможет ли VS найти пространство имен объектов для вас.

+0

@George, я считаю, что вы неправильно поняли вопрос –

+1

Это потрясающий ответ. Теперь я хочу знать, в чем вопрос. –

4

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

Вы также можете подписаться на Setup Форма Закрытое событие, а затем снова отобразить форму.

Подобно

 Setup setupForm = new Setup(); 
     setupForm.Show(); 
     setupForm.FormClosed += (o,e) => this.Show(); 
     this.Hide(); 

Edit для .NET 2,0

 Setup setupForm = new Setup(); 
     setupForm.Show(); 
     setupForm.FormClosed += new FormClosedEventHandler(setupForm_Closed); 
     this.Hide(); 


void setupForm_Closed(object sender, FormClosedEventArgs e) 
     { 
      this.Show(); 
     } 
+0

О, мне нравится этот метод. Я выбрал одноэлементный подход для хранения общедоступных форм, но это тоже хорошо, если вы хотите, чтобы основная форма обрабатывала свое собственное повторное открытие. Хороший подход. – BenAlabaster

+0

@Ben, спасибо. Я также предложил статику, есть много способов скрыть кошку :) –

+0

+1 Помните, что это будет работать, только если основная форма должна быть загружена каждый раз, когда эта форма закрыта. Если другой сценарий, требующий открытия вызывающей формы, тогда ему нужно будет использовать другой подход. – BenAlabaster

4

В описанной ситуации вы хотите вернуть исходный экземпляр. Вы использовали this.hide, чтобы скрыть форму.

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

Есть несколько способов сделать это, но я бы вероятно, принять один из двух подходов:

Singleton:

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

public static class GlobalForms 
{ 
    private MainForm _main; 
    public MainForm Main 
    { 
     get 
     { 
      if (_main == null) _main = new MainForm(); 
      return _mainForm; 
     } 
    } 

} 

Теперь, когда вы хотите MainForm, вместо того, чтобы вводить его в ноль, вы ссылаетесь на синглтон.

Form mainInstance = GlobalForms.Main 
mainInstance.Show(); 
//Do any other stuff for your main form. 
this.Hide(); //Or this.Close(); 

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

Открытие второй формы, как ребенок из первого:

Form otherForm = new OtherForm(); 
otherForm.Show(this); //This sets up the main form as the owner of this one for this call 
this.Hide(); 

В качестве альтернативы, если вы хотите OtherForm открыт как модальный диалог (т.е. вы не можете взаимодействовать с другими окнами, в то время как это один открыт) , а затем сделать otherForm.ShowDialog(this);

И от OtherForm:

this.Owner.Show(); 
this.Close(); 

В качестве альтернативы, Stan R обсудил a neat idea using an event handler to catch the close event of the child form. Хотя это может потенциально стать сложным, если у вас есть несколько форм, открывающих вашу дочернюю форму, поэтому, если эта форма является общим диалогом для многих форм, этот подход следует использовать с осторожностью.

Вы также можете получить доступ к коллекции Application.OpenForms, чтобы получить формы, которые в настоящее время открыты в вашем приложении. Вам нужно будет знать индекс формы, которую вы хотите активировать.

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

+0

@Ben, когда вы называете это из детской формы, вы не сможете использовать **, используя **, я прав? –

+0

@Stan Хороший улов, спасибо. Вы правы, я исправил свой фрагмент кода. – BenAlabaster

+0

+1 от меня за хорошую реализацию. –

1

Если вам просто нужно использовать форму установки временно, другим подходом было бы открыть форму в виде диалога.

using(Setup fh = new Setup()) 
{ 
    this.Hide(); 
    fh.ShowDialog(); 
    this.Show(); 
} 
Смежные вопросы