如何检查窗体是否已打开,如果是,则将其关闭?

时间:2010-10-05 07:24:52

标签: c# winforms

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

如何打开“fm”形式,如果它打开,如果它打开则将其关闭并再次打开,我每隔10分钟如何制作一次!

现在,表单fm始终使用form fm = new form();创建 因此,当我尝试检查表单是否打开时,即使之前有一个表单,它也将始终为false并打开一个新窗口!

我需要一个工具给它一个唯一的身份,然后检查这个具有唯一身份的表格是否被打开!

我不想只更新表单上的数据(fm),因为我有一个复杂的按钮信息。

表单名称为"UpdateWindow"

由于

27 个答案:

答案 0 :(得分:74)

也许这会有所帮助:

FormCollection fc = Application.OpenForms;

foreach (Form frm in fc)
{
//iterate through
}

foreach中的一些代码可以检测特定的表单,并且可以完成。虽然未经测试。

http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms

上找到

答案 1 :(得分:32)

我知道我迟到了......但对于那些好奇的人......这是另一种方式

if (Application.OpenForms.OfType<UpdateWindow>().Count() == 1)
    Application.OpenForms.OfType<UpdateWindow>().First().Close();

UpdateWindow frm = new UpdateWindow()
frm.Show();

答案 2 :(得分:13)

假设我们从菜单中调用表单单击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();               
    }                   
}

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

private bool CheckOpened(string name)
{
    FormCollection fc = Application.OpenForms;

    foreach (Form frm in fc)
    {
        if (frm.Text == name)
        {
            return true; 
        }
    }
    return false;
}

希望这将解决创建表单的多个实例的问题,如果已经打开或最小化,也可以在菜单单击时将焦点集中到Form1上。

答案 3 :(得分:10)

我不确定我是否理解这一说法。希望这可以帮助。 如果您只想使用此表单的一个实例进行操作,则应阻止用户关闭Form.Dispose。为此,您可以处理子表单的Closing事件。

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

然后您不需要创建frm的新实例。只需在实例上调用Show方法。

您可以检查Form.Visible属性以检查表单目前是否打开。

private ChildForm form = new ChildForm();

private void ReopenChildForm()
{
    if(form.Visible)
    {
        form.Hide();
    }
    //Update form information
    form.Show();
}

实际上,我仍然不明白你为什么不直接更新表格上的数据。

答案 4 :(得分:2)

Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null;
if (fc != null)
{
    fc.Close();
}

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

Form1 frm = New Form1();
frm.show();

答案 5 :(得分:2)

Form fc = Application.OpenForms["UpdateWindow"]; 

if (fc != null) 
   fc.Close(); 

fc.Show();

答案 6 :(得分:1)

if( ((Form1)Application.OpenForms["Form1"]).Visible == true)
    //form is visible
else
    //form is invisible

其中Form1是表单的名称。

答案 7 :(得分:1)

试试这个,它会起作用:

//inside main class
Form1 Fm1 = new Form1();<br>

//in button click
if (Fm1.IsDisposed)
{
    Fm1 = new Form();
}
Fm1.Show();
Fm1.BringToFront();
Fm1.Activate();

答案 8 :(得分:1)

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

答案 9 :(得分:0)

尝试一下,无需遍历表格:

df[complete.cases(df), ]


  v1 v2 varA varB
1  1 11    7    1
2  2 12    8    2
3  3 13    9    3

答案 10 :(得分:0)

我已经调整了我之前发表的文章。可以完美地工作,而不必遍历所有打开的表单。

        Form fc = Application.OpenForms["FormBrowse"];
        if (fc != null)
        {
            fc.Select();
        }
        else
        {
            var formBrowse = new FormBrowse();
            formBrowse.Show();
        }

答案 11 :(得分:0)

如果您要检查“第二个表单”是否已经打开并避免在buttong单击上再次打开它,则此方法有效。

import matplotlib.pyplot as plt

# Create a date column from index (easier to manipulate)
df["date_column"] = pd.to_datetime(df.index)

# Create a year column
df["year"] = df["date_column"].dt.year

# Create a month-day column
df["month_day"] = (df["date_column"].dt.month).astype(str).str.zfill(2) + \
                "-" + df["date_column"].dt.day.astype(str).str.zfill(2)

# Plot. Pivot will create for each year a column and these columns will be used as series.
df.pivot('month_day', 'year', 'Value').plot(kind='line', figsize=(12, 8), marker='o' )
plt.title("Values per Month-Day - Year comparison", y=1.1, fontsize=14)
plt.xlabel("Month-Day", labelpad=12, fontsize=12)
plt.ylabel("Value", labelpad=12,  fontsize=12);  

答案 12 :(得分:0)

这肯定会说出来。我也为自己使用了此功能。

  public static bool isFormOpen(Form formm)
    {

        foreach (Form OpenForm in Application.OpenForms)
        {
            if (OpenForm.Name == formm.Name)
            {
                return true;
            }
        }

        return false;
    }

答案 13 :(得分:0)

以下实际上效果很好。

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

答案 14 :(得分:0)

  

我认为我的方法是最简单

    Form2 form2 = null;
    private void SwitchFormShowClose_Click(object sender, EventArgs e)
    {  
        if(form2 == null){
            form2 = new Form2();
            form2.Show();
        }
        else{
            form2.Close();
            form2 = null;
        }
    }

答案 15 :(得分:0)

这对我有用:

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

答案 16 :(得分:0)

if (Application.OpenForms["Form_NAME"] == null)
{
   new Form_NAME().Show();
}

如果表单实例未打开,它将进入IF循环。

答案 17 :(得分:0)

在我的应用程序中,我有一个mainmenu表单,其中有按钮可以导航到各种其他形式(也就是子表单)。我希望每次只运行一个子表单的一个实例。此外,我想确保用户是否尝试启动已存在的子表单,该子表单将被强制显示&#34; front&amp; center&#34;如果最小化或其他应用程序窗口后面使用当前最受欢迎的答案,我重复了他们的答案:

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

答案 18 :(得分:0)

Form user_rpt = Application.OpenForms["frmUesr_reports"];
        if (user_rpt == null)
        {
            /// Do Something here
        }

试试这是检查表格是否打开

的简短想法

答案 19 :(得分:0)

仅形成一次

如果您的目标是拨打表单的多个实例,请考虑遵循......

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

答案 20 :(得分:0)

 private static Form IsFormAlreadyOpen(Type formType)
 {
     return Application.OpenForms.Cast<Form>().FirstOrDefault(openForm => openForm.GetType() == formType);
 }

答案 21 :(得分:0)

试试这个

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

答案 22 :(得分:0)

*希望这适用于你

System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"];
if(((Order)f1)!=null)
{
//open Form
}
else
{
//not open
}

答案 23 :(得分:0)

好笑,我不得不加入这个帖子。

1)在form.show()上添加一个全局var并清除form.close()上的var

2)在父表单上添加一个计时器。保持子表单打开并每10分钟更新一次数据。

3)在子表单上放置计时器以自行更新数据。

答案 24 :(得分:0)

这是我用来关闭所有打开的表单(主表单除外)

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

答案 25 :(得分:0)

尝试在下面连线,

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

通过上面的事件接线,只要表格被最小化,部分/完全隐藏在另一个表格中,它就会告诉您。

答案 26 :(得分:-1)

另外,可能会有所帮助


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