C# 如何向Windows窗体的所有者进行引用?

C# 如何向Windows窗体的所有者进行引用?,c#,winforms,C#,Winforms,Visual Studio 2013,Visual C#,Windows窗体应用程序 我对两种形式的课程感兴趣。在gameform.cs之后的和gameform.cs之后的 只有当用户单击第二个按钮时,第一个按钮才会弹出 AfterTheGameForm afterTheGameForm = new AfterTheGameForm(); afterTheGameForm.Show(this); 所以很明显,游戏形态是游戏形态之后的所有者。这就是我的问题在AfterHegameForm类中中,

Visual Studio 2013,Visual C#,Windows窗体应用程序

我对两种形式的课程感兴趣。在gameform.cs之后的和gameform.cs之后的

只有当用户单击第二个按钮时,第一个按钮才会弹出

AfterTheGameForm afterTheGameForm = new AfterTheGameForm();
afterTheGameForm.Show(this);
所以很明显,游戏形态是游戏形态之后的所有者。这就是我的问题在AfterHegameForm类中中,我想引用所有者类以使用其特定方法。我确信游戏的主人属于游戏类型,我正在尝试施展:

TheGameForm gForm = (TheGameForm)this.Owner;
        if(gForm!=null){               
            MessageBox.Show(theGameForm.CheckedRadioButton);
        }
        else
        {
            MessageBox.Show("theGameForm==null");
        }
我也试过这个演员:

TheGameForm gForm = this.Owner as TheGameForm;

gForm对象为空这是怎么可能的?

这可能是因为您正在构造函数中访问它。
所有者
设置在构造函数之后。请尝试加载事件。

这可能是因为您正在构造函数中访问它。
所有者
设置在构造函数之后。尝试加载事件。

如果没有良好的测试,就无法诊断代码中的问题。也就是说,从您发布的一点点代码来看,您的
在游戏表单
之后显然与
游戏表单
紧密耦合,即它知道类型并直接访问类的特定成员。更好的设计是使用事件或其他抽象来允许表单进行交互,而不必以那种方式相互绑定。换句话说,
AfterheGameForm
甚至不需要设置
Owner
属性来实现此处正确的事情。是的,您是对的。我不知道如何设计好的代码,这是我的问题!:)我在所有者那里找到了这个解决方案,并尝试使用它。另一种方法是
thegameformgform=Application.OpenForms.OfType().FirstOrDefault()如果没有良好的诊断,就不可能诊断代码中的问题。也就是说,从您发布的一点点代码来看,您的
在游戏表单
之后显然与
游戏表单
紧密耦合,即它知道类型并直接访问类的特定成员。更好的设计是使用事件或其他抽象来允许表单进行交互,而不必以那种方式相互绑定。换句话说,
在游戏形式之后
甚至不需要设置
所有者
属性,就可以在这里发生正确的事情。是的,你是对的。我不知道如何设计好的代码,这是我的问题!:)我在所有者那里找到了这个解决方案,并尝试使用它。另一种方法是
thegameformgform=Application.OpenForms.OfType().FirstOrDefault()为什么原始代码试图在构造函数中使用
Owner
?据推测,OP至少了解,由于构造函数必须在调用
Show()
方法之前返回,因此不可能在那里设置
Owner
属性。实际上,在构造函数之后设置Owner可能会有所帮助@Jeroen van Langen它也在加载事件中起作用!为什么原始代码试图在构造函数中使用
Owner
?据推测,OP至少了解,由于构造函数必须在调用
Show()
方法之前返回,因此不可能在那里设置
Owner
属性。实际上,在构造函数之后设置Owner可能会有所帮助@Jeroen van Langen它也在加载事件中起作用!