Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中关闭所有以前的表单并打开新表单#_C#_Winforms - Fatal编程技术网

C# 在C中关闭所有以前的表单并打开新表单#

C# 在C中关闭所有以前的表单并打开新表单#,c#,winforms,C#,Winforms,在Windows窗体C#中打开新窗体时,如何关闭背景窗体 它不应该是要关闭的特定表单 每当打开一个窗体时,它应该关闭所有后台窗体 由于只有一个窗体处于活动状态且处于前台,因此在打开新窗体时,可以关闭前一个窗体: 以您的主要形式: Form previous_form = null; 创建任何表单时: if( previous_form != null) previous_form.Close(); SomeForm someform = new SomeForm(); previsou

在Windows窗体C#中打开新窗体时,如何关闭背景窗体

  • 它不应该是要关闭的特定表单
  • 每当打开一个窗体时,它应该关闭所有后台窗体

  • 由于只有一个窗体处于活动状态且处于前台,因此在打开新窗体时,可以关闭前一个窗体:

    以您的主要形式:

    Form previous_form = null;
    
    创建任何表单时:

    if( previous_form != null)
        previous_form.Close();
    SomeForm someform = new SomeForm();
    previsous_form = some_form;
    someform.Show();
    
    两种方法

    首先是使用
    应用程序。OpenForms
    如下:

    foreach (Form form in Application.OpenForms)
    {
        if(Form is YourMainFormClassName) //Check if current form is your main form and do not close it since your app would close. You can use .Hide() if you want
            return;
    
        form.Close();
    }
    
    public partial class YourForm
    {
        public YourForm()
        {
            InitializeComponents();
    
            this.Tag = Settings.MaxIdOfOpenedForm() + 1; //We are setting Tag of newly opened form
            Settings.OpenedForms.Add(this); //Adding new form to opened forms.
        }
    }
    
    另一种方法是使用
    列表
    ,但您不能执行
    列表
    ,因为在删除时,如果您想删除特定的表单,并且像
    您的列表一样,您会遇到问题。删除(此)
    它将删除具有该表单类的所有项目。当然,只有在多次打开一个表单时才会发生这种情况,但为了避免这种情况,我们将使用
    form.Tag
    属性

    public static class Settings //Class is also static
    {
        public static List<Form> OpenedForms = new List<Form>();
    
        public static int MaxIdOfOpenedForm() //With this method we check max ID of opened form. We will use it later
        {
            int max = -1;
            foreach(Form f in OpenedForms)
            {
                if(Convert.ToInt32(f.Tag) > max)
                    max = Convert.ToInt32(f.Tag);
            }
            return max;
        }
    
        public static void RemoveSpecificForm(Form form) //Remove specific form from list
        {
            for(int i = 0; i < OpenedForms.Count; i++)
            {
                if((OpenedForms[i] as Form).Tag == form.Tag)
                {
                    OpenedForms.Remove(form);
                    return;
                }
            }
        }
    
        public static void CloseAllOpenedForms()
        {
            for(int i = 0; i < OpenedForms.Count; i++)
            {
                OpenedForms.Remove(OpenedForms[i]);
            }
        }
    }
    
    包含控件数据的对象。默认值为空

    因此,我们将使用它来存储表单的
    Id

    现在,当我们准备好系统时,让我们来编写它:

    首先,我们需要所有类都可以访问的
    列表
    ,这样我们就可以像
    公共静态
    属性一样创建它

    public static class Settings //Class is also static
    {
        public static List<Form> OpenedForms = new List<Form>();
    
        public static int MaxIdOfOpenedForm() //With this method we check max ID of opened form. We will use it later
        {
            int max = -1;
            foreach(Form f in OpenedForms)
            {
                if(Convert.ToInt32(f.Tag) > max)
                    max = Convert.ToInt32(f.Tag);
            }
            return max;
        }
    
        public static void RemoveSpecificForm(Form form) //Remove specific form from list
        {
            for(int i = 0; i < OpenedForms.Count; i++)
            {
                if((OpenedForms[i] as Form).Tag == form.Tag)
                {
                    OpenedForms.Remove(form);
                    return;
                }
            }
        }
    
        public static void CloseAllOpenedForms()
        {
            for(int i = 0; i < OpenedForms.Count; i++)
            {
                OpenedForms.Remove(OpenedForms[i]);
            }
        }
    }
    
    当我们关闭表单时,我们需要从列表中删除表单:

    private void YourFormClosed(object sender, EventArgs e)
    {
        RemoveSpecificForm(this);
    }
    
    当我们设置它时,只需调用
    closeAllowenedForms()


    此方法在性能上可能会有一些改进,但这是基本的,您可以进一步扩展它。

    您有打开新表单的父表单吗?
    foreach(var form in Application.OpenForms)form.Close()(在WinForms的情况下)是的,它有一个父表单@Ashkan Mobayen Khiabani请您详细说明一下..@Dmitry BychenkoJimi:是的
    Hide()
    可能是一个更好的选择。不必要:您好,我想关闭背景表单,但不应指定要关闭的此表单或该表单@Ashkan Mobayen Khiabaniwell当新表单打开时,您希望关闭backgronud表单,当新表单打开时,所有以前的表单都将在后台。因此,打开每个表单时,您应该关闭上一个表单(将转到后台),但我为什么要指定上一个表单,因为它的后台可能有任意数量的表单…@Ashkan Mobayen Khiabani是否有任何解决方案…请发送给我。@SouravKumarDas如果您有多个表单要关闭,你需要在某处保留这些参考资料的列表。或者关闭
    Application.OpenForms
    中除起始表单(在
    Program.cs
    中运行的表单)之外的所有表单。不过,它看起来不像是一个华丽的设计。