簡體   English   中英

C#WinForms,在UserControl中添加UserControl

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM