2009-10-05 28 views
0

我有一個對話框,顯示有關對象的一些信息。我想關閉這個對話框來顯示相同​​的對話框,但現在與對象的兄弟。這是一個複雜的對話框,根據指定的對象加載不同的組件,我無法將引用更改爲另一個對象。 我試圖在Closed事件中啓動新的對象,但前者沒有從屏幕消失並繼續顯示。還嘗試了一種靜態方法,在對話框中調用whith,將相同的對話框作爲參數傳遞,因此它關閉對話框'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

涉及的對話框是模態還是非模態? – 2009-10-05 18:08:00

回答

0

我能找到出路的唯一方式是通過一個靜態方法調用我的對話框退出模式),然後使用靜態變量來標記何時需要重新打開對話框。所以當靜態方法中的對話執行結束時,它會檢查是否需要重新打開。 否則我沒有看到一個可能的方法。

0

如果不知道SiblingSiblingDialog類裏面的具體情況,確定就可以了。唯一的限制是如果關閉了應用程序主窗口的窗口,應用程序將退出。

你可以,例如,提供一種方法,像這樣:

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

這將關閉formToClose並顯示formToShow

+0

這與我在靜態方法中所做的幾乎相同,我將關閉一個對話框並顯示新對話框。當我在第一個Dialog中調用這個方法時,它在方法執行時不會關閉,但是當函數(調用Close()方法時)結束。看起來像釋放資源的Dispose或其他方法只在方法結束後調用。 – jmayor 2009-10-05 20:19:14

0

如果您已設置爲第一個對話框的所有者,你知道它的類型,你應該能夠解決這個問題如下:

  • 寫在對話框的 所有者自定義事件。
  • 當用戶單擊關閉按鈕時,調用該事件。
  • 不要 從按鈕關閉對話框。

  • 當事件處理程序調用 時,擁有窗口關閉 對話框。然後讓擁有的對話框 顯示兄弟對話框。

0

Fredrik Mork's answer延伸,其解決的事實閉合形式可以是形式控制所述程序的退出狀態。

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

Application.Run告訴程序時傳遞給它的形式(用那種單身的關閉

0

由於您似乎在設置對話框的所有者,您可以嘗試在MyForm類的FormClosed()事件處理函數中使用owner.BeginInvoke()。:

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爲自己給出的答案基本相同,並被標記爲接受。 (事實是Mike Hoffer的回答有點難以遵循。)

相關問題