[英]Owner Form in Winforms
假设您有两种形式:FormA和FormB ..
在FormA中,我有一些属性。 FormA创建FormB并设置所有者属性。 例如:
public FormA()
{
FormB = new FormB(){Owner = this};
}
现在,在FormB中,如果我想要访问我在FormA上声明的属性。 为什么我在写作时看不到它们:
Owner. // here I need to see FormA properties...
为什么它不像这样工作?
尝试这个:
var forma = Owner as FormA;
forma.Stuff = otherstuff;
由于继承和多态性,你无法看到。
.NET中的表单继承自名为Form的基类。 FormA是一个派生自Form的类,FormB也是如此。
现在,Form提供了一个所有者表单,
public Form Owner { get; }
您为其分配了FormA。 没问题! 派生类可以视为其基类。 但是,如果您访问它,则会返回一个表单,因此您需要做的是将新表单转换回您实际提供的表单:
FormA form = (FormB)Owner;
这与做的几乎相同:
FormA form = Owner as FormB;
但有一些警告。 as
运算符是“安全转换”,如果对象不是提供的类型,则返回null。
我建议你只使用我们提供的代码,当你有时间时,研究继承和多态。 它们是了解正在发生的事情的关键。
如果我可以做一些自我宣传,我写了一篇关于为什么你会通常避免as
这可能会觉得有趣,及时。
原因是一个叫做多态的概念。 在更具体的意义上, Owner
属性是Form
类型。 FormA
继承自Form
类型,因此在某种程度上,它是Form
和FormA
。 解决这个问题的方法是将所有者“ FormA
”为FormA
,如下所示:
FormA fa = Owner as FormA;
if (fa != null)
{
// do something
}
你想在这里检查null
的原因是,也许其他人正在使用你的FormB
,并且已将Owner
属性设置为FormC
类型,你不一定能够控制它。 在这种情况下, Owner as FormA
的代码Owner as FormA
将返回null
。 因此,空检查确保您不会得到任何令人讨厌的惊喜。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.