Подтвердить что ты не робот

С# открыть новую форму, а затем закрыть текущую форму?

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

  • Открыть форму 2 (от кнопки в форме 1)
  • Закрыть форму 1
  • Фокус на форме 2
4b9b3361

Ответ 1

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

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}

Ответ 2

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

{
    this.Hide();
    Form1 sistema = new Form1();
    sistema.ShowDialog();
    this.Close();
}

Ответ 3

Проблема существа с этой строкой:

Application.Run(new Form1()); Скорее всего, это можно найти в файле program.cs.

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

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

То, что я считаю самым легким в вашей ситуации, - это создать 3 формы:

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

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

  • form3 - будет играть роль другой формы, которая должна быть открыта.

И вот пример кода для этого:
(Я также добавил пример, чтобы закрыть приложение из третьей формы)

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

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

Удачи.

Ответ 4

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

  • make frmMain форма запуска; это то, что выглядит моя Program.cs:

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

    public bool IsLoggedIn { get; set; }
    
  • my 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. Поскольку это форма запуска, когда она закрывается, приложение заканчивается.

Ответ 5

private void buttonNextForm(object sender, EventArgs e)
{
    NextForm nf = new NextForm();//Object of the form that you want to open
    this.hide();//Hide cirrent form.
    nf.ShowModel();//Display the next form window
    this.Close();//While closing the NextForm, control will come again and will close this form as well
}

Ответ 6

используйте этот фрагмент кода в вашей форме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();
}

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

Ответ 7

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

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

    }

Ответ 8

Многие другие способы уже описаны другими ответами. Однако многие из них либо участвуют 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());
        }
    }
}

Ответ 9

Предположим, у вас есть две формы, первое имя формы - Form1, а второе имя формы - Form2.Вы должны перейти от Form1 к Form2, введите здесь код. Напишите код следующим образом:

В Form1 у меня есть одна кнопка с именем Button1, а на ее клике выберите код ниже:

protected void Button1_Click(Object sender,EventArgs e)
{
    Form frm=new Form2();// I have created object of Form2
    frm.Show();
    this.Visible=false;
    this.Hide();
    this.Close();
    this.Dispose();
}

Надеюсь, что этот код поможет вам

Ответ 10

//if Form1 is old form and Form2 is the current form which we want to open, then
{
Form2 f2 = new Form1();

this.Hide();// To hide old form i.e Form1
f2.Show();
}

Ответ 11

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

Master frm = new Master();

this.Hide();

frm.ShowDialog();

this.Close();

Ответ 12

                     this.Visible = false;
                        //or                         // will make LOgin Form invisivble
                        //this.Enabled = false;
                         //  or
                       // this.Hide(); 



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

                        this.Dispose();

Ответ 13

Если у вас есть две формы: 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();

Ответ 14

Я бы решил это:

private void button1_Click(object sender, EventArgs e)
{
    Form2 m = new Form2();
    m.Show();
    Form1 f = new Form1();
    this.Visible = false;
    this.Hide();
}