簡體   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