如何检查一个窗体是否已经打开,如果是,closures它?

我有一个窗体“fm” ,它是一个简单的信息窗口,每10分钟打开一次( fm.Show(); )。

我怎么能每隔10分钟检查一次,如果“fm”格式是打开的,打开它就closures它并再次打开!

现在,窗体fm总是用form fm = new form();
所以当我试图检查表单是否打开时,即使以前只有一个表单,它也会一直是错误的,并打开一个新窗口!

我需要有一个工具来给它一个独特的身份,然后检查是否打开这个具有唯一身份的forms!

我不想只更新窗体(fm)上的数据,因为我有一个复杂的button信息。

表单名称是"UpdateWindow"

解决使用以下内容:

 Form fc = Application.OpenForms["UpdateWindow"]; if (fc != null) fc.Close(); fc.Show(); 

也许这有助于:

 FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { //iterate through } 

在foreach中的一些代码来检测特定的forms,它可以完成。 未经testing,但。

findhttp://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表单,那么我们需要在顶层创build该表单的实例声明,如下所示:

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

定义检查Form1的CheckOpened是否已经打开:

 private bool CheckOpened(string name) { FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { if (frm.Text == name) { return true; } } return false; } 

希望这将解决创build窗体的多个实例的问题,如果它已被打开或最小化,也将焦点放在Form1的菜单上。

我不确定我是否理解这个说法。 希望这可以帮助。 如果只想使用此表单的一个实例进行操作,则应该防止用户closures时的Form.Dispose调用。 为了做到这一点,你可以处理子窗体的closures事件。

 private void ChildForm_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); e.Cancel = true; } 

然后你不需要创buildfrm新实例。 只需在实例上调用Show方法即可。

你可以检查Form.Visible属性来检查表单是否打开。

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

它将closuresform1,如果你想使用它,你可以再次打开该表单:

 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(); 

尝试下面的电汇,

 private void frmMyForm_Deactivate(object sender, EventArgs e) { // Raise your flag here. } 

通过事件上面的布线,每当表格被最小化时,它会告诉你,部分/完全隐藏另一种forms。

这是我用来closures所有的开放forms(除了主窗体)

  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)在form.show()上添加一个全局variables,并清除form.close()

2)在父窗体上添加一个计时器。 保持孩子的forms开放,并更新您的数据每10分钟。

3)把计时器放在子窗体上去更新自己的数据。

*希望这将为你工作

 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); } 

只能形成一次

如果你的目标是拨出一个窗体的多个instaces,请考虑以下…

 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 } 

试试这是检查表格打开或不打开的简短的想法

在我的应用程序中,我有一个mainmenuforms,有button导航到各种其他forms(又名子forms)。 我只想每次运行一个子表单的一个实例。 另外,我想确保一个用户是否试图启动一个已经存在的子表单,这个子表单将被强制显示为“front&center”,如果最小化或者落后于其他应用程序窗口。 使用当前最有帮助的答案,我重构了他们的答案:

 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循环。

这工作forms我:

 public void DetectOpenedForm() { FormCollection AllForms = Application.OpenForms; Boolean FormOpen = false; Form OpenedForm = new Form(); foreach (Form From in AllForms) { if (Form.Name == "YourFormName") { OpenedForm = Form; FormOpen = true; } } if (FormOpen == true) { OpenedForm.Close(); } } 

试试这个MDICHILDfunction

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

另外,这可能会有所帮助

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); } } }
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); } } }