Winforms中的所有者表单

时间:2013-03-14 21:55:23

标签: c# .net winforms

假设您有两种形式:FormA和FormB ..

在FormA中,我有一些属性。 FormA创建FormB并设置所有者属性。例如:

public FormA() 
{
    FormB = new FormB(){Owner = this};
}

现在,在FormB中,如果我想访问我在FormA上声明的属性。 为什么我在写作时看不到它们:

Owner. // here I need to see FormA properties...

为什么它不能像这样工作?

3 个答案:

答案 0 :(得分:4)

试试这个:

var forma = Owner as FormA;
forma.Stuff = otherstuff;

答案 1 :(得分:4)

由于继承和多态性,你无法看到。

.NET中的表单继承自名为Form的基类。 FormA是一个派生自Form的类,FormB也是如此。

现在,Form有一个对所有者表单的引用,

public Form Owner { get; }

您已为其分配了FormA。没问题!派生类可以视为其基类。但是,如果您访问它,则会返回一个表单,因此您需要做的是新表单转换回您实际提供的表单:

FormA form = (FormB)Owner;

这几乎与:

相同
FormA form = Owner as FormB;

但有一些警告。 as运算符是“安全转换”,如果对象不是提供的类型,则返回空值。

我建议您只使用我们提供的代码,并在您有时间时研究继承和多态性。它们是了解正在发生的事情的关键。

如果我可以进行一些自我推销,我wrote a piece了解为什么你一般会避免as及时发现你感兴趣的内容。

答案 2 :(得分:3)

原因是一个名为polymorphism的概念。在更具体的意义上,Owner属性的类型为FormFormA继承自Form类型,因此在某种程度上,它是Form以及FormA。解决这个问题的方法是将所有者“强制转换”为FormA,如下所示:

FormA fa = Owner as FormA;
if (fa != null)
{
    // do something
}

您要在此处检查null的原因是,其他人可能正在使用您的FormB,并且已将Owner属性设置为FormC类型,你不一定能够控制的。在这种情况下,代码Owner as FormA将返回null。因此,空检查确保您不会有任何令人讨厌的意外。