C # Windows формы заявки формы проблемы - PullRequest
1 голос
/ 25 февраля 2011

У меня есть приложение c # windows form, которое содержит несколько форм.

Обычно, например, в form1 я создаю экземпляр form2, а затем

form1.hide();
form2.show();

Но иногда я хочу, чтобы предыдущая форма показывала и удаляла текущую форму. Как я могу позвонить в предыдущую форму?

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 25 февраля 2011

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

Решение ваших проблем управления формой становится очень простым, если вы создаете класс контроллера, который,как минимум, управляет созданием и удалением ваших форм любым удобным для вас способом.

Таким образом, ваш пример кода будет фактически запущен из класса контроллера как-то вроде:

public class FormsController
{
    private Form form1 = new Form();
    private Form form2 = new Form();

    public void SwitchForms()
    {
        form1.hide();
        form2.show();
    }
}

Для дальнейшей редакции обратитесь к архитектурному шаблону MVC для аккуратной работы с данными, бизнес-логикой и интерфейсом.

1 голос
/ 25 февраля 2011

Эта логика должна обрабатываться в Program.cs. Метод Main() инициализирует форму Form1. Вы хотите взять управление там вместо того, чтобы передавать управление в форму.

Пример:

static class Program
{
    internal static Form1 MyForm1;
    internal static Form2 MyForm2;
    /// 
    /// The main entry point for the application.
    /// 
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Application.Run(new Form1());

        // Initialize Form1
        MyForm1 = new Form1();
        MyForm1.FormClosing += new FormClosingEventHandler(MyForm1_FormClosing);

        // You may want to initialize Form2 on-demand instead of up front like here.
        MyForm2 = new Form1();
        MyForm2.FormClosing += new FormClosingEventHandler(MyForm2_FormClosing);

        // Show Form1 first
        MyForm1.Show();

        // Now we need to occupy the thread so it won't exit the app. This is normally the job of Application.Run.
        // An alternative to this is to have a third form you pass on control to.
        while (true)
        {
            Application.DoEvents();
            System.Threading.Thread.Sleep(10);
        }
    }

    static void MyForm1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Do something, for example show Form2
        MyForm2.Show();

        // EXAMPLE: We only want to hide it?
        e.Cancel = true;
        MyForm1.Visible = false;
    }
    static void MyForm2_FormClosing(object sender, FormClosingEventArgs e)
    {
        // Do something, for example show Form1
        MyForm1.Show();

        // EXAMPLE: We only want to hide it?
        e.Cancel = true;
        MyForm2.Visible = false;
    }
}

Так как Программа статична, вы можете получить доступ к MyForm1 и MyForm2 в любом месте этого проекта:

Program.MyForm1.Show();
Program.MyForm2.Hide();

Если вы планируете использовать много форм / сложной логики, я предлагаю перенести это в отдельный класс. Также рассмотрите возможность использования одной формы и вращайте вместо нее пользовательские элементы управления.

1 голос
/ 25 февраля 2011

Если вы установите для владельца новой формы ссылку на текущую форму, вы можете ссылаться на этого владельца из новой формы. Вы также можете подписаться на событие Closed () новой формы из старой формы с кодом для его удаления (хотя форма может избавиться от нее путем переопределения OnClosed, если это все равно не происходит).

1 голос
/ 25 февраля 2011

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

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

Если вы унаследовали новый класс для своей формы1 от Form и добавили метод, подобный closeSecondForm, вы можете закрыть его и удалить вторую форму.

Возможно, существует множество разных способов решения проблемы. Это всего лишь несколько.

0 голосов
/ 25 февраля 2011

Вы можете сделать это в форме1:

...
var form2 = new form2();
form2.Closing += (form2_Closing);
this.hide();
form2.show();
...


private void form2_Closing(object sender, System.EventArgs e)
{
    this.show();
}
0 голосов
/ 25 февраля 2011
Form2 myform = new Form2();

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