2011-04-16 99 views
1

嗨,我試圖從面板創建自定義面板類C#

class FormPanel : Panel 
    { 
     bool previous; 
     FormPanel l; 

     public FormPanel() 
     { 
      previous = false; 
      l.Parent = this; 
      l.Dock = DockStyle.Fill; 

     } 
    } 

成立了一個名爲FormPanel中的自定義面板這是非常我在哪裏現在。我想讓FormPanel擁有一個bool變量,並且想要設置它的Parent和Dock的默認屬性。這個怎麼用?我如何設置這些?但我不認爲「base.Parent =這也

class FormPanel : Panel 
{ 
    bool previous; 

    public FormPanel() 
    { 
     previous = false; 
     base.Parent = this; 
     base.Dock = DockStyle.Fill; 

    } 
} 

+0

設置.Parent爲「this」的目的是什麼? – 2011-04-16 14:23:03

+0

此代碼不相關。因爲它炸彈與NullReferenceException。當你解決這個問題時,它會用OutOfMemoryException來炸彈。 'l'成員需要離開,爲什麼它甚至存在還不清楚。另外忘記設置Parent屬性。 – 2011-04-16 14:26:36

+0

我一直在尋找這方面的答案一段時間,並碰到這個東西。我試了一下,但沒有奏效,但是我把它放在了裏面,以防萬一它有用。我回答了我想要的所有答案,如果你可以看看它,將不勝感激^^ – SaintHUN 2011-04-16 14:41:51

回答

1

如果你希望你的面板有DockStyle.Fill爲默認的Dock屬性,這樣做:

public class FormPanel : Panel 
{ 
    public FormPanel() 
    { 
     this.Dock = DockStyle.Fill; 
    } 

    [System.ComponentModel.DefaultValue(typeof(DockStyle), "Fill")] 
    public override DockStyle Dock 
    { 
     get { return base.Dock; } 
     set { base.Dock = value; } 
    } 
} 

這使得Dock屬性默認在屬性窗口中填充。

+0

我現在使用這個,只是手動設置父,如果沒有更好的方法,這是好的,謝謝你的幫助:) – SaintHUN 2011-04-16 14:51:34

+0

關於設置父,喬提供了一些工作。除非它在構造函數中傳遞,否則不能在控件內設置控件的父級。 – takrl 2011-04-16 15:00:18

+0

(...點擊五分鐘編輯邊界...)但是,除非您動態地在窗體上創建控件,否則您無法真正使用該構造函數。 FormPanel的構造函數在窗體的InitializeComponent()中被調用,並且該代碼由Visual Studio自動生成,不應該被觸摸。即使您現在能夠通過父項,我認爲將控件添加到窗體的控件集合中可將控件的父窗體設置爲窗體(當然,除非它包含在另一個容器控件中)。 – takrl 2011-04-16 15:12:50

1

你不應該直接使用你的類型的內部變量,而不是設置屬性(您從基類繼承) 「將工作...

+0

謝謝。我剛剛開始使用這些東西,所以它有點困難:)所以我不能真正設置父手動? – SaintHUN 2011-04-16 14:22:57

+0

您可以設置父級,但是當父級是控制本身時,您希望發生什麼?一些屬性也會看父母以找到他們的價值 - 這些將通過這種方式進入無限循環。 – 2011-04-16 14:26:56

1

你需要添加更多關於你想要實現的信息。

既然這樣你的FormPanel中有一個私有字段(L),這本身就是一個FormPanel中:

FormPanel l; 

你永遠不會實例化這個領域,所以它永遠是空的,在構造函數中分配給特性將失敗,NullReferenceException

l.Parent = this;    
l.Dock = DockStyle.Fill; 

如果沒有實例化這個私有字段,你將有遞歸,因爲你的FormPanel中包含一個私人FormPanel中,它本身包含一個私人FormPanel中,...

l = new FormPanel(); 
l.Parent = this;    
l.Dock = DockStyle.Fill; 

你說你想設置一個默認的Parent,但是我沒有看到FormPanel如何知道它的父對象是在構造函數中,除非你將父對象作爲參數傳遞給構造函數。也許你正在尋找的東西,如:

public FormPanel() : this(null) 
{ 
} 

public FormPanel(Control parent) 
{ 
    if (parent != null) 
    { 
     this.Parent = parent; 
    } 
    this.Dock = DockStyle.Fill; 
    ... 
} 
+0

謝謝我會嘗試搞設置 – SaintHUN 2011-04-16 14:24:38

+0

我有一個MenuStrip,你可以點擊不同的東西,例如:EditMenu或Login。每次點擊其中一個我想顯示相應的面板EditMenu - > EditPanel登錄 - > LoginPanel。我想給它們一個布爾值「previous」,所以我會在Show()之前知道它們中哪個需要Hide()。也許有一個更簡單的方法,這是我想出的。 – SaintHUN 2011-04-16 14:28:50