[英]C# WinForms, adding a UserControl within a UserControl
我正在一個非常以GUI為中心的項目,帶有自定義UserControl拖放對象。 我在窗體上創建和顯示UserControl時沒有問題。 我遇到的問題是創建另一種類型的UserControl並將其與第一種關聯。
我有一個名為HardwareComponent的類,它是主要形式的子級。 在構造對象時,我也希望構造一個名為ComponentPanel的對象,但也應將其作為控件添加到主窗體中。 這樣,通過一次調用創建新的組件時,將自動創建面板,但是它們在表單上仍是兩個單獨的控件對象。
這是一個摘錄:
class HardwareComponent : UserControl
{
public ComponentPanel panel;
public HardwareComponent()
{
panel = new ComponentPanel();
panel.Location = new Point(this.Right + 5, this.Top);
panel.Name = Guid.NewGuid().ToString();
Parent.Controls.Add(panel);
}
}
實際上是ComponentPanel對象:
class ComponentPanel : UserControl
{
public string guid { get; set; }
public ComponentPanel()
{
}
}
*未顯示的是OnPaint覆蓋方法
如果我將ComponentPanel的創建移動到表單類,則沒有問題,但是現在我必須從表單類創建兩個對象。 我覺得讓組件創建面板是一種更干凈的方法。
無論如何,當我執行上面的代碼時,嘗試向表單(“硬件組件”類的父級)添加“面板”時,它將引發NullReferenceException。 我試圖將面板對象作為一個公共全局變量,認為這是一個“權限”問題。 仍然沒有骰子。
本質上,我希望此UserControl創建另一個UserControl,但將其添加到窗體中。 這是最佳做法嗎? 還是我必須同時從表單類中添加兩者?
編輯:漢斯在這里回答了更深層的問題。 我沒有意識到null引用異常實際上是指向“父母”的。 我以為它不喜歡我的對象。 我沒有考慮過這樣一個事實,因為我是在運行時動態創建對象,然后定義其屬性,然后將其添加到表單中,所以Parent沒有定義。 因此,構造函數不知道誰是父母。
我這樣做的主要目的是從邏輯的角度出發。 這兩個對象可以被視為同一對象。 該組件在表單上顯示為塊。 雙擊它時,將出現一個面板,向您顯示該塊中的內容。 這兩個對象必須同時可見並且彼此可以自由移動,因此為什么它不僅僅是視圖更改。
我的解決方案是創建一個創建混蛋子對象的方法,該子對象在創建Component對象后從主窗體調用。 例:
this.Controls.Add(dummyComponent);
dummyComponent.InitializePanel();
我同意這樣做是一個錯誤的設計。 但是,一種實現此方法的方法是重寫OnParentChanged()並在此處創建“兄弟”控件:
class HardwareComponent : UserControl
{
public ComponentPanel panel = null;
public HardwareComponent()
{
}
protected override void OnParentChanged(EventArgs e)
{
if (this.panel == null && this.Parent != null)
{
this.panel = new ComponentPanel();
this.panel.Location = new Point(this.Right + 5, this.Top);
this.panel.Name = Guid.NewGuid().ToString();
this.Parent.Controls.Add(panel);
}
base.OnParentChanged(e);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.