web-dev-qa-db-fra.com

c # ouvrir un nouveau formulaire puis fermer le formulaire actuel?

Par exemple, supposons que je sois au formulaire 1, alors je veux:

  1. Ouvrir le formulaire 2 (à partir d'un bouton du formulaire 1)
  2. Fermer le formulaire 1
  3. Focus sur la forme 2
61
tnhan07

La solution de Steve ne fonctionne pas. Lors de l'appel this.Close (), le formulaire actuel est supprimé avec form2. Par conséquent, vous devez le cacher et définir un événement form2.Closed pour appeler this.Close ().

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

Essayez de faire ça ...

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

Le problème des êtres avec cette ligne:

Application.Run(new Form1()); Ce qui peut probablement être trouvé dans votre fichier program.cs.

Cette ligne indique que form1 doit gérer la boucle de messages - en d'autres termes, form1 est chargé de continuer à exécuter votre application - l'application sera fermée lorsque form1 sera fermé.

Il y a plusieurs façons de gérer cela, mais chacune d'entre elles, d'une manière ou d'une autre, ne ferme pas form1.
(Sauf si nous modifions le type de projet par autre chose que l'application Windows Forms)

Celle qui me semble la plus facile à votre situation est de créer 3 formes:

  • form1 - restera invisible et agira en tant que gestionnaire, vous pouvez l'assigner pour gérer une icône de barre d'état système si vous le souhaitez.

  • form2 - aura le bouton qui, lorsqu'on cliquera dessus, fermera form2 et ouvrira form3

  • form3 - aura le rôle de l'autre formulaire à ouvrir.

Et voici un exemple de code pour accomplir cela:
(J'ai aussi ajouté un exemple pour fermer l'application à partir de la 3ème forme)

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


Remarque: travailler avec des panneaux ou charger des contrôles utilisateur de manière dynamique est plus théorique et préférable aux normes de production de l'industrie (mais il me semble que vous essayez simplement de raisonner sur le fonctionnement des choses), cet exemple est donc préférable.

Et maintenant que les principes sont compris, essayons avec seulement deux formes:

  • Le premier formulaire prendra le rôle du gestionnaire comme dans l'exemple précédent, mais présentera également le premier écran - il ne sera donc pas fermé, mais masqué.

  • Le second formulaire aura pour rôle d'afficher l'écran suivant et en cliquant sur un bouton, vous fermerez l'application. 


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

Si vous modifiez l'exemple précédent, supprimez form3 du projet.

Bonne chance.

9
G.Y

De nombreuses manières différentes ont déjà été décrites dans les autres réponses. Cependant, beaucoup d'entre eux soit impliqué dans ShowDialog() ou que form1 reste ouvert mais caché. La meilleure et la plus intuitive, à mon avis, consiste simplement à fermer form1, puis à créer form2 à partir d'un emplacement extérieur (c'est-à-dire pas à partir de l'un de ces formulaires). Dans le cas où form1 a été créé dans Main, form2 peut simplement être créé à l'aide de Application.Run, tout comme form1 auparavant. Voici un exemple de scénario:

J'ai besoin que l'utilisateur entre ses informations d'identification afin que je puisse les authentifier d'une manière ou d'une autre. Ensuite, si l'authentification a réussi, je souhaite montrer l'application principale à l'utilisateur. Pour ce faire, j'utilise deux formes: LogingForm et MainForm. La variable LoginForm a un drapeau qui détermine si l'authentification a réussi ou non. Cet indicateur est ensuite utilisé pour décider de créer ou non l'instance MainForm. Aucune de ces formes n'a besoin de connaître l'autre et les deux formes peuvent être ouvertes et fermées avec grâce. Voici le code pour ceci:

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
Manuzor

Vous n'étiez pas spécifique, mais il semble que vous essayiez de faire ce que je fais dans mes applications Win Forms: commencez avec un formulaire de connexion, puis après une connexion réussie, fermez ce formulaire et mettez l'accent sur un formulaire principal. Voici comment je le fais:

  1. faire frmMain le formulaire de démarrage; Voici à quoi ressemble mon Program.cs: 

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
  2. dans mon frmLogin, créez une propriété publique qui est initialisée à false et définie sur true uniquement si une connexion réussie a lieu: 

    public bool IsLoggedIn { get; set; }
    
  3. mon frmMain ressemble à ceci: 

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

Pas de connexion réussie? Quittez l'application. Sinon, continuez avec frmMain. Comme il s'agit du formulaire de démarrage, l'application se ferme à la fermeture.

6
Barry Novak

utilisez cet extrait de code dans votre formulaire1.

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

Je l'ai eu de ici

1
lakshman

Ce code peut vous aider:

Master frm = new Master();

this.Hide();

frm.ShowDialog();

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



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

                        this.Dispose();
0
Aamir Zargar

Supposons que vous ayez deux formulaires. Le nom du premier formulaire est Form1 et le second nom est Form2.Vous devez passer de Form1 à Form2 et entrer le code ici. Écrivez le code comme suit: 

Sur Form1, j'ai un bouton nommé Button1, et sur son option de clic, écrivez ci-dessous le code:

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

J'espère que ce code vous aidera

0
Shahnawaz

Je pense que c'est beaucoup plus facile :)

    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
Sachith
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
}
0
Prateek Shukla

Si vous avez deux formulaires: frm_form1 et frm_form2. Le code suivant est utilisé pour ouvrir frm_form2 et fermer frm_form1. (Pour les applications de formulaire 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();
0
maneesh
//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();
}
0
user2186819