2014-12-25 17 views
0

假設我們有form A,它有一個「運行嚮導」按鈕。點擊這個按鈕打開一個嚮導來創建一些東西。該向導從另一個項目導入,該項目形成A參考。該向導在其工作期間創建了幾個數組。在發生來自另一個類別的事件後執行代碼的最佳方式發生在c#

這是點擊按鈕的代碼:

private void buttonOpenWizard_Click(object sender, EventArgs e) 
     { 
      SampleWizard wizard = new SampleWizard(); 
      wizard.Show(); 
      //(theoretical code using arrays created by the wizard) 
     } 

什麼是等待嚮導完成,只有完成嚮導任務之後運行的理論代碼的最佳方式是什麼?

+0

創建任務可以幫助你 – Tushar

+0

是否'顯示()'方法塊,等到嚮導完成,還是異步?嚮導是否提供了API來訪問它收集的數據?我假設這將需要做後者,你的問題的答案將取決於我的第一個問題的答案。 – JLRishe

+0

如果您不介意在嚮導期間阻止原始表單,請使用「ShowDialog」。 – Chris

回答

2

因爲你似乎並不介意堵塞,使用ShowDialog

private void buttonOpenWizard_Click(object sender, EventArgs e) 
{ 
    SampleWizard wizard = new SampleWizard(); 
    if(wizard.ShowDialog() == DialogResult.OK) // this line will block until the wizard form is closed 
    { 
     // and any code here will not run until that has happened 
    } 
} 

通常使用從ShowDialog調用的返回值,以指示在用戶完成嚮導/對話框與否。在這種情況下,我無法知道該表單是否使用該表單,但在這裏我假定它已經這樣做了。

如果您不希望阻止,你應該能夠做這樣的事情:

private void buttonOpenWizard_Click(object sender, EventArgs e) 
{ 
    SampleWizard wizard = new SampleWizard(); 
    wizard.FormClosed += WizardClosed; // hook up event handler 
    wizard.Show(); 
} 

private void WizardClosed(object sender, FormClosedEventArgs e) 
{ 
    var wizard = (SampleWizard)sender; 
    // check and use result of wizard here 
} 
+0

謝謝!不知道Show和ShowDialog之間的區別。順便說一下,出於好奇,如果我確實介意阻塞,它將如何解決? – Simon

+0

一種方法是將事件處理程序掛接到窗體的FormClosed事件,使用普通的Show方法顯示它,然後在事件處理程序中進行處理。 – Chris

+0

你可以用代碼編輯你的答案嗎?只是爲了未來。聖誕節快樂! :) – Simon

1
private void buttonOpenWizard_Click(object sender, EventArgs e) 
    { 
     SampleWizard wizard = new SampleWizard(); 
     if(wizard.ShowDialog()== DialogResult.OK) //Set the dialog result to ok in your form, if it would closed corret 
     { 
     //(theoretical code using arrays created by the wizard) 
     } 

    } 
相關問題