2011-04-20 93 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窗体的父项。