none
Многооконный интерфейс RRS feed

  • Вопрос

  • Что-то у меня затык образовался казалось бы на ровном месте.
    Есть 2 формы Form1, Form2.
    Вводим в Form1 данные и нажимаем кнопку, открывается Form2, Form1 скрывается:
    Form _Form2 = new Form2();
    _Form2.Show();
    this.Hdie();
    после произведения необходимых манипуляций надо обратно показать Form1 а Form2 скрыть.
    как мне это реализовать?

    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 0:46 MSDN Forums consolidation (От:Форум по .NET Framework)
    4 марта 2010 г. 11:14

Ответы

  • поднимался такой вопрос уже здесь где-то
    необходимо передать ссылку на форму1 в форму2:

    //Form1
    Form _Form2 = new Form2(this);
    _Form2.Show();
    this.Hide();
    
    //Form2
    public partial class Form2 : Form
    {
        private Form1 _Form1;
        public Form2(Form1 _Form1)
        {
            InitializeComponent();
            this._Form1 = _Form1;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            _Form1.Show();
            this.Hide();
        }
    }

    • Помечено в качестве ответа JusteG 4 марта 2010 г. 14:27
    4 марта 2010 г. 11:34
  • internal enum FormType {Form1, Form2, Form3};
    
        internal static class UIDispatch
        {
            private static Form1 form1;//хранит ссылки на формы
            private static Form2 form2;
            private static Form3 form3;
    
            internal static Form ShowForm(FormType formType)
            {
                Form result= null;
                switch (formType)
                {
                    case FormType.Form1:
                        if (form1 == null)//если формы нет создает новую
                            form1 = new Form1();
                        form1.Show();
                        result = form1;
                        break;
                    case FormType.Form2:
                        if (form2 == null)
                            form2= new Form2();
                        form2.Show();
                        result = form2;
                        break;
                    case FormType.Form3:
                        if (form3 == null)
                            form3 = new Form3();
                        form3.Show();
                        result = form3;
                        break;
                    default:
                        break;
                }
                return result;//возвращает ссылку на форму
            }
    
            internal static void HideForm(FormType formType)
            {
                switch (formType)
                {
                    case FormType.Form1:
                        if (form1 != null)
                            form1.Hide();
                        break;
                    case FormType.Form2:
                        if (form2 != null)
                            form2.Hide();
                        break;
                    case FormType.Form3:
                        if (form3 != null)
                            form3.Hide();
                        break;
                    default:
                        break;
                }
            }
    
        }
    Собственно выше пример диспетчера форм.

    так будет выглядеть класс Program

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(UIDispatch.ShowForm(FormType.Form1));// создаем форму через диспетчер
            }
    все, далее в каждой форме делаете следующее

            private void button1_Click(object sender, EventArgs e)
            {
                this.Hide();//текущую скрываем
                UIDispatch.ShowForm(FormType.Form1);// тут подставите нужный тип
            }
    • Предложено в качестве ответа Nikonorov Evgeniy 4 марта 2010 г. 13:38
    • Помечено в качестве ответа JusteG 4 марта 2010 г. 14:27
    4 марта 2010 г. 13:20

Все ответы

  • поднимался такой вопрос уже здесь где-то
    необходимо передать ссылку на форму1 в форму2:

    //Form1
    Form _Form2 = new Form2(this);
    _Form2.Show();
    this.Hide();
    
    //Form2
    public partial class Form2 : Form
    {
        private Form1 _Form1;
        public Form2(Form1 _Form1)
        {
            InitializeComponent();
            this._Form1 = _Form1;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            _Form1.Show();
            this.Hide();
        }
    }

    • Помечено в качестве ответа JusteG 4 марта 2010 г. 14:27
    4 марта 2010 г. 11:34
  • а вот вам код побаловаться :)

            internal static void ProceesForms()
            {
                foreach (Form f in Application.OpenForms)
                {
                    if (!f.Visible)
                        f.Show();
                    else
                        f.Hide();
                }
            }

    скрывает все открытые формы, и открывает закрытые :)
    бесполезно, но в вашем двуформенном случае может решить задачу.
    так при старте приложения создаете 2 формы, 1 скрываете.
    затем вызывая эту функцию - 1 будет появляться, другая исчезать.

    Если форм будет много - рекомендую создать диспетчер, который будет хранить ссылки на формы.
    и скрывать открывать формы через него
    4 марта 2010 г. 11:54
  • Спасибо, содержательно.
    Вот только опять ничего не выходит... (
    Смысл такой: Я пишу программу, при запуске она показывает пользователю форму1 (аутентификация), по успешному прохождению аутентификации, программа должна показать форму2 (основное тело программы) из которого можно попасть в формы 3 (настройки) и 4 (протокол событий).
    Проблемы:
    1. Я с этими ссылками что то запутался, в пределах двух окон еще понятно а третье прикрутить не смог.
    2. Форма 4 должна создаться на этапе аутентификации !НО не отображаться пользователю, она должна быть созданна скрытой т.к. см п.3.
    3. В ходе работы программы, из формы 2 данные должны записываться в RTB формы 4.
    4. Непонятно с сериализацией, настройки должны быть в отдельном класе, а как же их пользовать в других классах? Как их подгружать во время загрузки программы, и сохранять во время выхода.
    5. Как корректно остановить работающие потоки которые выполняют работу до того как начать останавливать основной поток.
    6. Евгений, вопрос к вам, можно пример подобного диспетчера.

    Вотъ.
    Заранее благодарен что со мной возитесь =)
    4 марта 2010 г. 12:31
  • internal enum FormType {Form1, Form2, Form3};
    
        internal static class UIDispatch
        {
            private static Form1 form1;//хранит ссылки на формы
            private static Form2 form2;
            private static Form3 form3;
    
            internal static Form ShowForm(FormType formType)
            {
                Form result= null;
                switch (formType)
                {
                    case FormType.Form1:
                        if (form1 == null)//если формы нет создает новую
                            form1 = new Form1();
                        form1.Show();
                        result = form1;
                        break;
                    case FormType.Form2:
                        if (form2 == null)
                            form2= new Form2();
                        form2.Show();
                        result = form2;
                        break;
                    case FormType.Form3:
                        if (form3 == null)
                            form3 = new Form3();
                        form3.Show();
                        result = form3;
                        break;
                    default:
                        break;
                }
                return result;//возвращает ссылку на форму
            }
    
            internal static void HideForm(FormType formType)
            {
                switch (formType)
                {
                    case FormType.Form1:
                        if (form1 != null)
                            form1.Hide();
                        break;
                    case FormType.Form2:
                        if (form2 != null)
                            form2.Hide();
                        break;
                    case FormType.Form3:
                        if (form3 != null)
                            form3.Hide();
                        break;
                    default:
                        break;
                }
            }
    
        }
    Собственно выше пример диспетчера форм.

    так будет выглядеть класс Program

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(UIDispatch.ShowForm(FormType.Form1));// создаем форму через диспетчер
            }
    все, далее в каждой форме делаете следующее

            private void button1_Click(object sender, EventArgs e)
            {
                this.Hide();//текущую скрываем
                UIDispatch.ShowForm(FormType.Form1);// тут подставите нужный тип
            }
    • Предложено в качестве ответа Nikonorov Evgeniy 4 марта 2010 г. 13:38
    • Помечено в качестве ответа JusteG 4 марта 2010 г. 14:27
    4 марта 2010 г. 13:20