Как проверить, открыта ли уже форма windows, и закрыть ее, если она есть?
у меня есть форма "fm" это просто информационное окно, которое открывается каждые 10 минут (fm.Show();
).
как я могу сделать, что каждые 10 минут он будет проверять, если форма "fm" открыт, и если он открыт, он закрывает его и снова открывает!
теперь форма fm всегда создается с form fm = new form();
поэтому, когда я пытаюсь проверить, открыта ли форма, она всегда будет ложной и откроет новое окно, даже если есть одна форма раньше!
мне нужно инструмент, чтобы дать ему уникальную идентичность, а затем проверить, открыта ли эта форма с уникальной идентичностью или нет!
Я не хочу просто обновлять данные на форме (fm), потому что у меня есть сложная информация с кнопками.
имя формы "UpdateWindow"
решается с помощью следующего:
Form fc = Application.OpenForms["UpdateWindow"];
if (fc != null)
fc.Close();
fc.Show();
23 ответа:
может это поможет:
FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { //iterate through }
некоторый код в foreach для обнаружения конкретной формы, и это может быть сделано. Хотя и непроверенные.
найдено на http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms
Я знаю, что опаздываю... Но для тех, кто интересуется... Это другой способ
if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1) Application.OpenForms.OfType<UpdateWindow>().First().Close(); UpdateWindow frm = new UpdateWindow() frm.Show();
предположим, что если мы вызываем форму из меню нажмите на форму MDI, то нам нужно создать объявление экземпляра этой формы на верхнем уровне следующим образом:
Form1 fm = null;
Затем нам нужно определить событие щелчка меню для вызова Form1 следующим образом:
private void form1ToolStripMenuItem_Click(object sender, EventArgs e) { if (fm == null|| fm.Text=="") { fm = new Form1(); fm.MdiParent = this; fm.Dock = DockStyle.Fill; fm.Show(); } else if (CheckOpened(fm.Text)) { fm.WindowState = FormWindowState.Normal; fm.Dock = DockStyle.Fill; fm.Show(); fm.Focus(); } }
The CheckOpened определено для проверки Form1 уже открыт или нет:
private bool CheckOpened(string name) { FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { if (frm.Text == name) { return true; } } return false; }
надеюсь, что это решит проблемы при создании нескольких экземпляров формы также получить фокус в меню Form1 on щелкните, если оно уже открыто или свернуто.
я не уверен, что понимаю это утверждение. Надеюсь, это поможет. Если вы хотите работать только с одним экземпляром этой формы, вы должны предотвратить форма.Утилизировать вызов пользователя закрыть. Для этого можно обработать событие закрытия дочерней формы.
private void ChildForm_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); e.Cancel = true; }
и тогда вам не нужно создавать новые экземпляры
frm
. Просто вызовите метод Show на экземпляре.вы можете проверить форму.Видимое свойство, чтобы проверить, если форма открыта в момент.
private ChildForm form = new ChildForm(); private void ReopenChildForm() { if(form.Visible) { form.Hide(); } //Update form information form.Show(); }
на самом деле, я до сих пор не понимаю, почему бы тебе просто не обновить данные на форме.
Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null; if (fc != null) { fc.Close(); }
он закроет form1 вы можете открыть эту форму снова, если вы хотите его с помощью:
Form1 frm = New Form1(); frm.show();
if( ((Form1)Application.OpenForms["Form1"]).Visible == true) //form is visible else //form is invisible
здесь
Form1
- это имя вашей формы.
попробуйте это, он будет работать:
//inside main class Form1 Fm1 = new Form1();<br> //in button click if (Fm1.IsDisposed) { Fm1 = new Form(); } Fm1.Show(); Fm1.BringToFront(); Fm1.Activate();
попробуй такое MDICHILD функции
public void mdiChild(Form mdiParent, Form mdiChild) { foreach (Form frm in mdiParent.MdiChildren) { // check if name equals if (frm.Name == mdiChild.Name) { //close if found frm.Close(); return; } } mdiChild.MdiParent = mdiParent; mdiChild.Show(); mdiChild.BringToFront(); }
попробуйте подключить ниже,
private void frmMyForm_Deactivate(object sender, EventArgs e) { // Raise your flag here. }
по проводке выше события, он скажет вам, когда форма свернута, частично / полностью скрыта другой формой.
Это то, что я использовал, чтобы закрыть все открытые формы (кроме основной формы)
private void CloseOpenForms() { // Close all open forms - except for the main form. (This is usually OpenForms[0]. // Closing a form decrmements the OpenForms count while (Application.OpenForms.Count > 1) { Application.OpenForms[Application.OpenForms.Count-1].Close(); } }
смешно, я должен был добавить к этой теме.
1) Добавить глобальный var на форме.показать () и очистить var на форме.закрыть()
2) на родительской форме добавить таймер. Сохраняют форму ребенка открывать и обновлять данные каждые 10 минут.
3) поставить таймер на форму ребенка, чтобы пойти обновить данные о себе.
* надеюсь, что это будет работать для U
System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"]; if(((Order)f1)!=null) { //open Form } else { //not open }
попробуй такое
bool IsOpen = false; foreach (Form f in Application.OpenForms) { if (f.Text == "Form2") { IsOpen = true; f.Focus(); break; } } if (IsOpen == false) { Form2 f2 = new Form2(); f2.MdiParent = this; f2.Show(); }
private static Form IsFormAlreadyOpen(Type formType) { return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType); }
форма только один раз
Если ваша цель состоит в том, чтобы набрать несколько экземпляров формы, рассмотрите следующее ...
public class MyForm : Form { private static MyForm alreadyOpened = null; public MyForm() { // If the form already exists, and has not been closed if (alreadyOpened != null && !alreadyOpened.IsDisposed) { alreadyOpened.Focus(); // Bring the old one to top Shown += (s, e) => this.Close(); // and destroy the new one. return; } // Otherwise store this one as reference alreadyOpened = this; // Initialization InitializeComponent(); } }
Form user_rpt = Application.OpenForms["frmUesr_reports"]; if (user_rpt == null) { /// Do Something here }
попробуйте это это короткая идея, чтобы проверить форму открыть или не открыть
в моем приложении у меня была форма mainmenu, которая имела кнопки для перехода к ассортименту других форм (aka sub-forms). Я хотел, чтобы одновременно работал только один экземпляр каждой подформы. Кроме того, я хотел убедиться, что если пользователь попытается запустить уже существующую подформу, то подформа будет вынуждена показывать "front¢er", если она свернута или находится за другими окнами приложения. Используя в настоящее время наиболее популярные ответы, я переформулировал их ответы в это:
private void btnOpenSubForm_Click(object sender, EventArgs e) { Form fsf = Application.OpenForms["formSubForm"]; if (fsf != null) { fsf.WindowState = FormWindowState.Normal; fsf.Show(); fsf.TopMost = true; } else { Form formSubForm = new FormSubForm(); formSubForm.Show(); formSubForm.TopMost = true; } }
if (Application.OpenForms["Form_NAME"] == null) { new Form_NAME().Show(); }
если экземпляр формы не открыт, он войдет в цикл IF.
это сработало со мной:
public void DetectOpenedForm() { FormCollection AllForms = Application.OpenForms; Boolean FormOpen = false; Form OpenedForm = new Form(); foreach (Form form in AllForms) { if (form.Name == "YourFormName") { OpenedForm = form; FormOpen = true; } } if (FormOpen == true) { OpenedForm.Close(); } }
Я думаю, что мой метод простой.
Form2 form2 = null; private void SwitchFormShowClose_Click(object sender, EventArgs e) { if(form2 == null){ form2 = new Form2(); form2.Show(); } else{ form2.Close(); form2 = null; } }
ниже, на самом деле работает очень хорошо.
private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e) { var _open = false; FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { if (frm.Name == "FormBrowseNetworkInformation") { _open = true; frm.Select(); break; } } if (_open == false) { var formBrowseNetworkInformation = new FormBrowseNetworkInformation(); formBrowseNetworkInformation.Show(); } }
кроме того, может быть это поможет
class Helper { public void disableMultiWindow(Form MdiParent, string formName) { FormCollection fc = Application.OpenForms; try { foreach (Form form in Application.OpenForms) { if (form.Name == formName) { form.BringToFront(); return; } } Assembly thisAssembly = Assembly.GetExecutingAssembly(); Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First(); Form myProgram = (Form)Activator.CreateInstance(typeToCreate); myProgram.MdiParent = MdiParent; myProgram.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }