2009-10-05 3 views
0

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

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

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

     } 
+0

Являются ли вовлеченные диалоги модальными или немодальными? –

ответ

0

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

0

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

Вы могли бы, например, обеспечить метод следующим образом:

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

Это было бы закрыть formToClose и показать formToShow.

+0

Это почти то же самое, что я сделал в моем статическом методе, я закрываю один диалог и показываю новый. Когда я вызываю этот метод внутри первого диалогового окна, он не закрывается, когда выполняется этот метод, но когда заканчивается функция (где вызывается метод Close()). Кажется, что Dispose или другой метод для выделения ресурсов вызывается только после завершения метода. – jmayor

0

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

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

  • У вас есть окно с окном, закрывающее диалог при вызове обработчика события . Затем в диалоговом окне владельца показан диалог родного брата.

0

Расширение Fredrik Mork's answer, что касается того, форма закрытия может быть форма контроля состояния выхода из программы.

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

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

0

Как кажется, вы устанавливаете владельца диалогового окна, вы можете попробовать использовать 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); 
    } 
} 
1

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

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

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

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

Смежные вопросы