C# 避免在c中重复加载表单#

C# 避免在c中重复加载表单#,c#,winforms,C#,Winforms,我有两个windows窗体。Form1和form2都有一个按钮。当我点击form1中的按钮时,它会显示form2,反之亦然。但每次单击按钮时,它都会创建一个重复的表单。如何避免它。请告诉我。我的代码如下 表格1: private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); } private void button1_Click(object sender

我有两个windows窗体。Form1和form2都有一个按钮。当我点击form1中的按钮时,它会显示form2,反之亦然。但每次单击按钮时,它都会创建一个重复的表单。如何避免它。请告诉我。我的代码如下

表格1:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
}
private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    f1.Show();
}
表格2:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
}
private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    f1.Show();
}

问题是,每次单击按钮时,您都在创建一个新表单。 要解决此问题,可以使窗体保持静态

    static Form1 form = new Form1();
    private void button1_Click(object sender, EventArgs e)
    {
        form.Show();
    }

问题是,每次单击按钮时,您都在创建一个新表单。 要解决此问题,可以使窗体保持静态

    static Form1 form = new Form1();
    private void button1_Click(object sender, EventArgs e)
    {
        form.Show();
    }

我的解决方案,你可以试试

表格1

    private void button1_Click(object sender, EventArgs e)
            {
                FormCollection fc = Application.OpenForms;
                bool present = false;

                foreach (Form frm in fc)
                {

                    if (frm.Name == "Form2")
                    {
                        present = true;
                    }
                }

                if (!present)
                {
                    Form2 f2 = new Form2();
                    f2.Show();
                }
            }
表格2

 private void button1_Click(object sender, EventArgs e)
        {
            FormCollection fc = Application.OpenForms;
            bool present = false;

            foreach (Form frm in fc)
            {

                if (frm.Name == "Form1")
                {
                    present = true;
                }
            }

            if (!present)
            {
                Form1 f1 = new Form1();
                f1.Show();
            }
        }

我的解决方案,你可以试试

表格1

    private void button1_Click(object sender, EventArgs e)
            {
                FormCollection fc = Application.OpenForms;
                bool present = false;

                foreach (Form frm in fc)
                {

                    if (frm.Name == "Form2")
                    {
                        present = true;
                    }
                }

                if (!present)
                {
                    Form2 f2 = new Form2();
                    f2.Show();
                }
            }
表格2

 private void button1_Click(object sender, EventArgs e)
        {
            FormCollection fc = Application.OpenForms;
            bool present = false;

            foreach (Form frm in fc)
            {

                if (frm.Name == "Form1")
                {
                    present = true;
                }
            }

            if (!present)
            {
                Form1 f1 = new Form1();
                f1.Show();
            }
        }

只需使用此方法,并在单击按钮时传递类似“this”的参数

 public bool formIsExist(Form frmOpen)
    {
        FormCollection fc = Application.OpenForms;

        foreach (Form frm in fc)
        {
            if (frm.Name == frmOpen.Name)
            {
               return true;
            }
        }

        return false;
    }

只需使用此方法,并在单击按钮时传递类似“this”的参数

 public bool formIsExist(Form frmOpen)
    {
        FormCollection fc = Application.OpenForms;

        foreach (Form frm in fc)
        {
            if (frm.Name == frmOpen.Name)
            {
               return true;
            }
        }

        return false;
    }

最简单的方法是确定目标表单是否已经存在,在这种情况下,打开它

例如,在
Form1
中执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = null;
    for (int i = 0; i < Application.OpenForms.Count; i++)
    {
        if (Application.OpenForms[i] is Form2)
        {
            f2 = Application.OpenForms[i];
            break;
        }
    }

    if (f2 == null)
        f2 = new Form2();

    f2.Show();
}
private void按钮1\u单击(对象发送者,事件参数e)
{
Form2 f2=空;
for(int i=0;i
要为所有表单创建通用方法,可以尝试以下方法:

public static T GetForm<T>() where T : Form
{
    for (int i = 0; i < Application.OpenForms.Count; i++)
    {
        if (Application.OpenForms[i] is T)
            return (T)Application.OpenForms[i];
    }

    return null;
}
public static T GetForm(),其中T:Form
{
for(int i=0;i
把它叫做:

Form2 f2 = GetForm<Form2>();
if (f2 == null) f2 = new Form2();
form2f2=GetForm();
如果(f2==null)f2=newform2();

最简单的方法是确定目标表单是否已经存在,在这种情况下,打开它

例如,在
Form1
中执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2 = null;
    for (int i = 0; i < Application.OpenForms.Count; i++)
    {
        if (Application.OpenForms[i] is Form2)
        {
            f2 = Application.OpenForms[i];
            break;
        }
    }

    if (f2 == null)
        f2 = new Form2();

    f2.Show();
}
private void按钮1\u单击(对象发送者,事件参数e)
{
Form2 f2=空;
for(int i=0;i
要为所有表单创建通用方法,可以尝试以下方法:

public static T GetForm<T>() where T : Form
{
    for (int i = 0; i < Application.OpenForms.Count; i++)
    {
        if (Application.OpenForms[i] is T)
            return (T)Application.OpenForms[i];
    }

    return null;
}
public static T GetForm(),其中T:Form
{
for(int i=0;i
把它叫做:

Form2 f2 = GetForm<Form2>();
if (f2 == null) f2 = new Form2();
form2f2=GetForm();
如果(f2==null)f2=newform2();

@Mostafiz'的答案几乎是正确的。它只是错过了显示找到的当前表单的代码。(对不起,我还没有50%的声誉来写这篇评论)

请尝试以下代码:

表格1:

private void button1_Click(object sender, EventArgs e)
{
    Form form = null;

    //search all opened forms for one with name "Form2"
    foreach( Form frm in Application.OpenForms )
        if( frm.Name == "Form2" ) //this requires Form2 to be named "Form2"
        {
            form = frm;
            break;
        }

    //if no opened Form2 was found, create a new one
    if( form == null )
        form = new Form2();

    form.Show();
}
表格2:

private void button1_Click(object sender, EventArgs e)
{
    Form form = null;

    //search all opened forms for one with name "Form1"
    foreach( Form frm in Application.OpenForms )
        if( frm.Name == "Form1" ) //this requires Form1 to be named "Form1"
        {
            form = frm;
            break;
        }

    //if no opened Form1 was found, create a new one
    if( form == null )
        form = new Form1();

    form.Show();
}

@莫斯塔菲兹的回答几乎是正确的。它只是错过了显示找到的当前表单的代码。(对不起,我还没有50%的声誉来写这篇评论)

请尝试以下代码:

表格1:

private void button1_Click(object sender, EventArgs e)
{
    Form form = null;

    //search all opened forms for one with name "Form2"
    foreach( Form frm in Application.OpenForms )
        if( frm.Name == "Form2" ) //this requires Form2 to be named "Form2"
        {
            form = frm;
            break;
        }

    //if no opened Form2 was found, create a new one
    if( form == null )
        form = new Form2();

    form.Show();
}
表格2:

private void button1_Click(object sender, EventArgs e)
{
    Form form = null;

    //search all opened forms for one with name "Form1"
    foreach( Form frm in Application.OpenForms )
        if( frm.Name == "Form1" ) //this requires Form1 to be named "Form1"
        {
            form = frm;
            break;
        }

    //if no opened Form1 was found, create a new one
    if( form == null )
        form = new Form1();

    form.Show();
}


不要每次都创建一个新表单。将它们创建为隐藏(
OnLoad
),并且仅在单击按钮时显示
.Show()
,因为每次单击按钮时都要创建表单的新实例。如何操作?请告诉我…新建将创建一个新实例。您需要了解如何“从另一个表单引用表单”不要每次都创建新表单。将它们创建为隐藏(
OnLoad
),并且仅在单击按钮时显示
.Show()
,因为每次单击按钮时都要创建表单的新实例。如何操作?请告诉我…新建将创建一个新实例。你需要研究如何“从另一个表单引用一个表单”,你说不工作是什么意思?你想在form2显示虎钳诗句后form1消失吗?我的目的是当我点击form1中的按钮时,form2将被打开。类似地,当我点击form2中的按钮时,它再次显示form1。但在这里,当我点击form2中的按钮时,它没有显示任何内容。它没有显示任何内容,因为form1的一个实例已经打开,您要求不要创建一个副本,如果再次打开,它将是重复的,因此它不会打开另一个。我想再次返回到form1。但是,没有打开重复的表单。在我的代码中,当我每次单击按钮时,它都会显示新表单。我的应用程序中运行了这么多表单。不工作是什么意思?你想在form2显示虎钳诗句后form1消失吗?我的目的是当我点击form1中的按钮时,form2将被打开。类似地,当我点击form2中的按钮时,它再次显示form1。但在这里,当我点击form2中的按钮时,它没有显示任何内容。它没有显示任何内容,因为form1的一个实例已经打开,您要求不要创建一个副本,如果再次打开,它将是重复的,因此它不会打开另一个。我想再次返回到form1。但是,没有打开重复的表单。在我的代码中,当我每次单击按钮时,它都会显示新表单。我的应用程序中正在运行这么多表单。如果表单已关闭怎么办?如果表单已关闭怎么办?这将确定表单是否已打开,但它不提供将其置于前端的方法。如果要将其置于前端,请添加
frm.BringToFront()这确定表单是否已打开,但它不提供将其放在前面的方法。如果要将其放在前面,请添加
frm.BringToFront()