繁体   English   中英

Winforms中的所有者表单

[英]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类型,因此在某种程度上,它是FormFormA 解决这个问题的方法是将所有者“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM