c # открыть новую форму, а затем закрыть текущую форму? - PullRequest
64 голосов
/ 05 апреля 2011

Например, предположим, что я нахожусь в форме 1, тогда я хочу:

  1. Открыть форму 2 (с кнопки в форме 1)
  2. Закрыть форму 1
  3. Сосредоточьтесь на форме 2

Ответы [ 14 ]

159 голосов
/ 19 ноября 2012

Решение Стива не работает. При вызове this.Close () текущая форма располагается вместе с form2. Поэтому вам нужно скрыть это и установить событие form2.Closed для вызова this.Close ().

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}
20 голосов
/ 30 ноября 2012

Попробуйте сделать это ...

{
    this.Hide();
    Form1 sistema = new Form1();
    sistema.ShowDialog();
    this.Close();
}
11 голосов
/ 23 июня 2017

Многие другие способы уже описаны другими ответами. Тем не менее, многие из них либо ShowDialog(), либо form1 остаются открытыми, но скрытыми. На мой взгляд, лучший и наиболее интуитивный способ - просто закрыть form1, а затем создать form2 из внешнего местоположения (то есть не из одной из этих форм). В случае, когда form1 было создано в Main, form2 может быть просто создано с использованием Application.Run, как и form1 ранее. Вот пример сценария:

Мне нужно, чтобы пользователь ввел свои учетные данные, чтобы я мог как-то их аутентифицировать. После этого, если аутентификация прошла успешно, я хочу показать основное приложение пользователю. Для этого я использую две формы: LogingForm и MainForm. У LoginForm есть флаг, который определяет, была ли аутентификация успешной или нет. Этот флаг затем используется, чтобы решить, создавать ли экземпляр MainForm или нет. Ни одна из этих форм не должна знать о другой, и обе формы могут быть открыты и закрыты изящно. Вот код для этого:

class LoginForm : Form
{
    bool UserSuccessfullyAuthenticated { get; private set; }

    void LoginButton_Click(object s, EventArgs e)
    {
        if(AuthenticateUser(/* ... */))
        {
            UserSuccessfullyAuthenticated = true;
            Close();
        }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        LoginForm loginForm = new LoginForm();
        Application.Run(loginForm);

        if(loginForm.UserSuccessfullyAuthenticated)
        {
            // MainForm is defined elsewhere
            Application.Run(new MainForm());
        }
    }
}
10 голосов
/ 21 июля 2013

Проблемы с этой строкой:

Application.Run(new Form1()); Что, вероятно, можно найти в вашем файле program.cs.

Эта строка указывает, что form1 предназначена для обработки цикла сообщенийДругими словами, form1 отвечает за выполнение вашего приложения - приложение будет закрыто при закрытии формы 1.

Есть несколько способов справиться с этим, но все они так или иначе не закроют форму1.(Если только мы не изменим тип проекта на что-то кроме приложения Windows Forms)

Мне кажется, что в вашей ситуации проще всего создать 3 формы:

  • form1 - останется невидимым и выступит в роли менеджера, вы можете назначить его для обработки иконки в трее, если хотите.

  • form2 -будет иметь кнопку, которая при нажатии закроет форму 2 и откроет форму 3

  • форма 3 - будет играть роль другой формы, которую необходимо открыть.

А вот пример кода для этого:(Я также добавил пример закрытия приложения из 3-й формы)

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1()); //set the only message pump to form1.
    }
}


public partial class Form1 : Form
{
    public static Form1 Form1Instance;

    public Form1()
    {
        //Everyone eveywhere in the app should know me as Form1.Form1Instance
        Form1Instance = this;

        //Make sure I am kept hidden
        WindowState = FormWindowState.Minimized;
        ShowInTaskbar = false;
        Visible = false;

        InitializeComponent();

        //Open a managed form - the one the user sees..
        var form2 = new Form2();
        form2.Show();
    }

}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form3 = new Form3(); //create an instance of form 3
        Hide();             //hide me (form2)
        form3.Show();       //show form3
        Close();            //close me (form2), since form1 is the message loop - no problem.
    }
}

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1.
    }
}

Примечание: работа с панелями или динамическая загрузка пользовательских элементов управления более академичны и предпочтительнее отраслевых стандартов производства - но мне кажется, вы просто пытаетесь рассуждать о том, как все работает - для этой цели этот пример лучше.

И теперь, когда принципы понятны, давайте попробуем это с двумя формами:

  • Первая форма будет играть роль менеджера, как в предыдущем примере, нотакже будет представлен первый экран - поэтому он не будет закрыт просто скрытым.

  • Вторая форма будет играть роль показа следующего экрана и, нажав кнопку, закроет приложение.

    public partial class Form1 : Form
    {
        public static Form1 Form1Instance;

        public Form1()
        {
            //Everyone eveywhere in the app show know me as Form1.Form1Instance
            Form1Instance = this;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Make sure I am kept hidden
            WindowState = FormWindowState.Minimized;
            ShowInTaskbar = false;
            Visible = false;

            //Open another form 
            var form2 = new Form2
            {
                //since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
                TopMost = true
            };
            form2.Show();
            //now that that it is topmost and shown - we want to set its behavior to be normal window again.
            form2.TopMost = false; 
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.Form1Instance.Close();
        }
    }

Если вы изменили предыдущий пример - удалите форму 3 из проекта.

Удачи.

6 голосов
/ 06 октября 2014

Вы не были конкретны, но похоже, что вы пытались сделать то, что я делаю в моих приложениях Win Forms: начните с формы входа, затем после успешного входа закройте эту форму и сфокусируйтесь на главной форме.Вот как я это делаю:

  1. сделать frmMain формой запуска;Вот как выглядит мой Program.cs:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
  2. в моем frmLogin, создайте открытое свойство, которое инициализируется как false и устанавливается в true только в случае успешного входа:1010 *

    public bool IsLoggedIn { get; set; }
    
  3. мой frmMain выглядит так:

    private void frmMain_Load(object sender, EventArgs e)
    {
        frmLogin frm = new frmLogin();
        frm.IsLoggedIn = false;
        frm.ShowDialog();
    
        if (!frm.IsLoggedIn)
        {
            this.Close();
            Application.Exit();
            return;
        }
    

Нет успешного входа?Выйти из приложения.В противном случае продолжайте с frmMain.Поскольку это форма запуска, когда она закрывается, приложение закрывается.

1 голос
/ 26 ноября 2016

Если у вас есть две формы: frm_form1 и frm_form2. Следующий код используется для открытия frm_form2 и закрытия frm_form1. (Для приложения формы Windows)

        this.Hide();//Hide the 'current' form, i.e frm_form1 
        //show another form ( frm_form2 )   
        frm_form2 frm = new frm_form2();
        frm.ShowDialog();
        //Close the form.(frm_form1)
        this.Close();
1 голос
/ 21 июля 2013

используйте этот фрагмент кода в вашей форме 1.

public static void ThreadProc()
{
Application.Run(new Form());
}

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
t.Start();
this.Close();
}

Я получил это от здесь

0 голосов
/ 21 марта 2017

Я думаю, что это намного проще:)

    private void btnLogin_Click(object sender, EventArgs e)
    {
        //this.Hide();
        //var mm = new MainMenu();
        //mm.FormClosed += (s, args) => this.Close();
        //mm.Show();

        this.Hide();
        MainMenu mm = new MainMenu();
        mm.Show();

    }
0 голосов
/ 11 сентября 2013
                     this.Visible = false;
                        //or                         // will make LOgin Form invisivble
                        //this.Enabled = false;
                         //  or
                       // this.Hide(); 



                        Form1 form1 = new Form1();
                        form1.ShowDialog();

                        this.Dispose();
0 голосов
/ 23 июля 2013

Этот код может вам помочь:

Master frm = new Master();

this.Hide();

frm.ShowDialog();

this.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...