2011-04-20 92 views
5

我有兩種形式。C#ShowDialog父窗體爲空

LoadWorkstationFile提示用戶輸入他們想要加載的ID。

DisplayDataForm顯示他們在前一個屏幕上選擇的數據。

DisplayDataForm他們可以點擊一個選項加載新的數據,它調用LoadDataForm作爲ShowDiaglog:

private void openToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    var answer = MessageBox.Show("Do you wish to save the current work file before continuing?", "Confirmation", 
           MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); 
    if (answer == DialogResult.Cancel) 
    return; 
    if (answer == DialogResult.Yes) 
    SaveWorkFile(); 
    var prevworkstationid = Configuration.WorkstationId; 
    var lw = new LoadWorkstationFile(); 
    lw.ShowDialog(this); 
    if (Configuration.WorkstationId != prevworkstationid) 
    { 
    LoadData(); 
    } 

} 

正如你所看到的,我再次在同一屏幕促使他們之前。

LoadWorkstationFile它具有以下的代碼:

if (this.Parent == null) 
    { 
    var sc = new ScanCheck(); 
    sc.Show(); 
    this.Hide(); 
    } 

初始負載一切都很好。當我想再次加載數據時,它已經加載,我最終得到2個屏幕導致Parent總是等於空。

我有錯誤的想法嗎?使用.ShowDialog調用父級時應該是DisplayDataForm

像往常一樣感謝。

回答

15

您應該檢查Owner,而不是Parent

你在的ShowDialog的構造函數設置什麼是所有者財產。 它告訴表單其他表單「擁有」它。 父母(如Mario所示)描述了控制的所有權關係。

所以你應該更改您的代碼:

if (this.Owner == null) 
    { 
    var sc = new ScanCheck(); 
    sc.Show(); 
    this.Hide(); 
    } 

,它應該工作。

+0

在我第一眼看到的MSDN文件,我沒有找到該屬性,但後來我更新了我的評論;-) – 2011-04-20 14:20:16

+0

@Mario勺 - :)好老「RTFM」。感謝intellitrace,intellisense和常識編程的衆神:) 我必須承認,我必須在回答之前用Intellisense進行驗證,即使我使用了這個屬性數百萬次 – NightDweller 2011-04-20 14:46:35

+0

@NightDweller現在我有了一個新的開發環境(WinWord ),並且必須寫代號而不是代碼...所以它沒有那麼奢侈:-( – 2011-04-20 14:51:25

2

父是一個繼承自控件的屬性,用於描述嵌入關係(標籤具有父窗體的形式)。

我不認爲它使用ShowDialog()時設置。

我假設所有者是要檢查的正確屬性。

心連心

馬里奧

0

既然你逝去的DisplayDataForm父在lw.ShowDialog(this); DisplayDataForm在第二次調用時是LoadWorkstationFile窗體的父項。