Jashobanta Ответов: 4

Как подключить 2 формы в приложениях C# windows


Привет,

Я создаю приложение C# Windows forms, где есть 2 формы Form1 и Form2. Мне нужно соединить эти 2 формы таким образом, чтобы, когда одна форма активна, другая должна быть отключена. Например, форма 1 имеет кнопку на событии щелчка, из которой открывается форма 2 таким образом

Form2 newForm= new Form2();
newForm.Show();
this.Hide();



Теперь мне нужна функциональность,которая заключается в том, что когда форма 2 активирована, то открытая форма 1 должна быть деактивирована или отключена, и она должна быть активирована снова, когда форма Form2 закрыта .Может ли кто-нибудь помочь мне в решении этого вопроса?заранее спасибо.

Спасибо
Джашобанта Чакраборти

incaunu

попробуйте newForm.ShowDialog(это);

4 Ответов

Рейтинг:
32

OriginalGriff

Сделайте это наоборот, а вместо этого используйте ShowDialog;

Form2 newform = new Form2();
this.Hide();
newForm.ShowDialog();
this.Show();
ShowDialog не вернусь пока newform закрывающийся.


Jashobanta

Спасибо @OriginalGriff..Это сработало..

OriginalGriff

Всегда пожалуйста!

Рейтинг:
2

Drazen Pupovac

Вы можете сделать это на этом пути:
(Я не уверен в качестве, но это работает для меня)

private void button1_Click(object sender, EventArgs e)
{
    Form2 newForm = new Form2(this);
    newForm.Show();
    this.Hide();
}

//In Form2
Form parentForm;
public Form2(Form form)
{
    InitializeComponent();

    this.parentForm = form;
}

// and on closing event
private void Form2_FormClosing(object sender, EventArgs e)
{
    this.parentForm.Visible = true;
}


OriginalGriff

Моя единственная критика заключается в том, что это заставляет Form2 осознавать Form1 - а Form1 уже осознает Form2. Это уменьшает область повторного использования формы и исправляет то, что происходит с объектом вне домена Form2s.
Это было бы немного лучше, если бы экземпляр Form1 был передан конструктору Form2 как общий объект формы, а не производный Form1, но все же лучше в терминах ООП позволить Form1 обрабатывать себя, а Form2 оставаться в неведении о его существовании. (О, И кстати m_variablenames-это не обычный стиль для C#, вместо него рекомендуется использовать camelCase.)
Форма form1 m_form;
публичная форма 2(Форма 1)
становится
Форма parentForm;
общественные формы Form2(форма форма)

Drazen Pupovac

Я согласен, спасибо за совет. Теперь я улучшил свое решение (насколько это возможно :)).

Один вопрос: я читал, что для частных полей есть соглашение об именовании типа _variable. Это нормально?

OriginalGriff

Обычно - нет. В C# начальное подчеркивание обычно указывает на то, что это частная резервная переменная для публичного метода с аналогичным именем:
частная _myString;
общественные mystring совсем
{
get {return _myString;}
set {_myString = значение;}
}
Но не все их используют, некоторые назвали бы частное поле "myString" (я сам следую этому)

Взгляните на MSDN: http://msdn.microsoft.com/en-us/library/ms229045.aspx
Ссылки слева довольно детализированы.

Drazen Pupovac

Спасибо

Рейтинг:
2

Awesh Vishwakarma

Существует также новое решение, просто изменив конструктор формы приемника с некоторым параметром, и на основе этого параметра вы можете прочитать данные.

Например

.......
string param;
public ReceiverFormName(string param)
{
this.param=param;
}
.......


И назовем это так

........
ReceiverFormName rec = new ReceiverFromName("Hello World");
........



Я проверил это на себе! SGSM_Awesh


Рейтинг:
0

Catalin Serafimescu

Свяжите эти две формы (Form1 знает о Form2, а Forms2 знает о Form1).
Тогда использовать Form.Activate, Form.Deactivate, Form.Closed события на обоих