Как я могу открыть диалог Winform при закрытии другого? - PullRequest
0 голосов
/ 05 октября 2009

У меня есть диалог с отображением некоторой информации об объекте. Я хочу закрыть это диалоговое окно, чтобы показать то же самое диалоговое окно, но теперь с братом объекта. Это сложный диалог, который загружает различные компоненты в зависимости от назначенного объекта, я не могу просто изменить ссылку на другой объект Я попытался запустить новый в закрытом событии, но первый не исчез с экрана и продолжает показывать. Также пробовал статический метод, который вызывается в диалоге, передавая тот же диалог в качестве параметра, поэтому он закрывает диалоговое окно dialog.Close () и открывает новый с новым объектом для отображения. Но все же первый остается открытым. Есть ли способ сделать это, закрыв первое окно и открыв второе?

(Это статический подход, окно, переданное параметром, не закрывается, пока не будет создан новый созданный)

// From the Dialog try to launch the second one closing this.
private void btnSibling_Click(object sender, EventArgs e)
        {
                SwitchToSibling(this);
        }

private static void SwitchToSibling(SiblingDialog window)
        {
            try
            {
                double id = 0;
                id = window.SelectedSibling();
                if (id != 0)
                {
                    // Get's the same Parent so to the new Dialog
                    Control owner = window.Owner;
                    window.Close();
                    Sibling sibling= Sibling.Get(id);
                    SiblingDialog.ShowSibling(sibling, false, owner);
                }
            }
            catch (GroupException ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

Ответы [ 6 ]

1 голос
/ 27 июля 2011

У меня была та же проблема, и после большого количества устранения неполадок мне удалось решить ее совершенно по-другому: сначала я жду, когда произойдет событие Forms.Application.LeaveThreadModal, а затем жду следующего Forms.Application. Событие простоя произойдет. К тому времени первое диалоговое окно полностью исчезло, поэтому можно без проблем запустить второе диалоговое окно.

Ожидание только события ожидания или только события модального выхода или обоих событий в противоположном порядке не будет работать.

ВНИМАНИЕ: Ожидание только появления события простоя, ВОЗВРАЩАЕТСЯ, но только до тех пор, пока активация второго диалогового окна выполняется нажатием кнопки первого диалогового окна с помощью мыши. Если вы нажмете кнопку, нажав мнемоническую клавишу этой кнопки на клавиатуре, появится второй диалог над первым диалогом! Вы должны пройти последовательность, которую я описал, чтобы избежать этого!

Подумав об этом немного больше, мне кажется, что мое решение отчасти "волшебное", что означает, что оно может перестать работать в будущем выпуске фреймворка dotnet, поэтому я думаю, что я откажусь от него и последую совет Майка Хоффера, который, насколько я могу судить, по сути совпадает с ответом, который дал мне джмайор, и пометил как принятый. (Правда в том, что ответ Майка Хоффера немного сложен для понимания.)

0 голосов
/ 06 октября 2009

Поскольку кажется, что вы устанавливаете владельца диалогового окна, вы можете попробовать использовать owner.BeginInvoke () в обработчике событий FormClosed () в классе MyForm. :

public partial class MyForm : Form
{
    static int count = 0;
    public MyForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    public static void ShowMyDialog(MyForm form, IWin32Window owner)
    {
        count++;
        form.Text = "My ID: " + count;
        form.ShowDialog(owner);
    }

    delegate void MyDel(MyForm form, IWin32Window owner);

    private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        MyDel del = ShowMyDialog;
        MyForm mySecondForm = new MyForm();
        this.Owner.BeginInvoke(del, mySecondForm, this.Owner);
    }
}
0 голосов
/ 06 октября 2009

Единственный способ найти способ обойти это, вызвав мой диалог из статического метода (используя своего рода одноэлементный шаблон), а затем используя статическую переменную, чтобы пометить, когда диалог должен быть открыт заново. Поэтому, когда выполнение диалога заканчивается внутри статического метода, он проверяет, нужно ли его снова открыть. Иначе я не вижу возможного пути.

0 голосов
/ 05 октября 2009

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

private static void CloseAndShow(Form formToClose, Form formToShow)
{
    Application.Run(formToShow);
    formToClose.Close();
    formToShow.Show();
}

Application.Run указывает программе завершиться, когда переданная ей форма закрывается

0 голосов
/ 05 октября 2009

Если вы установили владельца для первого диалогового окна и знаете его тип, вы сможете решить эту проблему следующим образом:

  • Написать пользовательское событие в диалоге владелец.
  • Когда пользователь нажимает кнопку закрытия Кнопка, вызвать событие.
  • Не закройте диалог с кнопки.

  • Окно-владелец закройте диалог, когда обработчик события вызывается. Тогда есть собственный диалог показать диалоговое окно родного брата.

0 голосов
/ 05 октября 2009

Не зная специфику классов Sibling и SiblingDialog, вы точно можете. Единственное ограничение: если вы закроете окно, являющееся основным окном приложения, приложение закроется.

Вы можете, например, предоставить такой метод:

private static void CloseAndShow(Form formToClose, Form formToShow)
{
    formToClose.Close();
    formToShow.Show();
}

Это закроет formToClose и покажет formToShow.

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