Показать главную форму после скрытия

481
26 ноября 2016, 20:36

У меня есть две формы(Form1, Form2). Form1 появляется сразу после запуска программы, является основной и запускается через Application.Run(new Form1()); Мне необходимо реализовать переход от Form1 к Form2 и наоборот, но чтобы на экране отображалась только одна форма. На формах есть кнопки, переход к Form2 и возврат на главную форму. Переход на Form2 осуществлён через:

Form1.ActiveForm.Hide();
Form2 frm = new Form2();
frm.Show();

Как мне реализовать возврат к главной форме?

Answer 1
  1. Можно передавать ссылку на форму

    public class AppForm2 : System.Windows.Forms.Form
    {
        public Form ReturnForm;
        public AppForm2()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm2";
            Button button = new Button() { Text = "AppForm2" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            ReturnForm.Show();
            this.Close();
        }
    }
    public class AppForm1 : System.Windows.Forms.Form
    {
        public AppForm1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm1";
            Button button = new Button() { Text = "AppForm1" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            this.Hide();
            new AppForm2() { ReturnForm = this }.Show();
        }
    }
    
  2. Можно установить событие на закрытие формы

    public class AppForm2 : System.Windows.Forms.Form
    {
        public AppForm2()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm2";
            Button button = new Button() { Text = "AppForm2" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
    public class AppForm1 : System.Windows.Forms.Form
    {
        public AppForm1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm1";
            Button button = new Button() { Text = "AppForm1" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form form = new AppForm2();
            form.FormClosed += (object s, FormClosedEventArgs ev) => { this.Show(); };
            form.Show();
        }
    }
    
  3. Можно использовать диалоговое окно

    public class AppForm1 : System.Windows.Forms.Form
    {
        public AppForm1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm1";
            Button button = new Button() { Text = "AppForm1" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            this.Hide();
            new AppForm2().ShowDialog();
            this.Show();
        }
    }
    
  4. Можно написать через ApplicationContext, тогда можно формы не скрывать, а переключаться между ними. В таком случае можно логику перенести в отдельный класс.

    public class ApplicationManager 
    {
        private static ApplicationContext _context;
        public static ApplicationContext Context 
        {
            get 
            {
                if (_context == null)
                    _context = new ApplicationContext();
                return _context;
            }  
        }
        public static void ShowForm(Form form)
        {
            Form prev = Context.MainForm;
            Context.MainForm = form;
            prev.Close();
            form.Show();
        }
    }
    public class AppForm2 : System.Windows.Forms.Form
    {
        public AppForm2()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm2";
            Button button = new Button() { Text = "AppForm2" };
            button.Click += button_Click; 
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            ApplicationManager.ShowForm(new AppForm1());
        }
    }
    public class AppForm1 : System.Windows.Forms.Form
    {
        public AppForm1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm1";
            Button button = new Button() { Text = "AppForm1" };
            button.Click += button_Click;
            this.Controls.Add(btn);
        }
        private void button_Click(object sender, EventArgs e)
        {
            ApplicationManager.ShowForm(new AppForm2());
        }
    }
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        ApplicationManager.Context.MainForm = new AppForm1();
        Application.Run(ApplicationManager.Context);
    }
    

В общем-то вариантов, можно придумать другие или улучшить продемонстрированные короткие примеры под свои нужды. В любом случае все сводится к событиям или ссылкам на форме, отельный интерес представляет только ApplicationContext.

READ ALSO
Error at line Image.FromStream(ms, true), image from db

Error at line Image.FromStream(ms, true), image from db

I am trying to read "ico" image from MS SQL DB and set the to button imageI am getting an error(Parameter is not valid) at line: using (var img = Image

391
Как скачать все картинки с сайта с#?

Как скачать все картинки с сайта с#?

Привет! Подскажите, как можно скачать все картинки с сайта? Я понимаю, как сделать так, что бы можно было скачать одну картинкуНашел код на этом...

580
C#. Запрос к SOAP WEB службе

C#. Запрос к SOAP WEB службе

ЗдравствуйтеНеобходимо подключится к web службе по протоколу SOAP

593