创建自定义面板类C#

问题描述:

嗨,我试图从面板创建自定义面板类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

如果你希望你的面板有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

你不应该直接使用你的类型的内部变量,而不是设置属性(您从基类继承) “将工作...

+0

谢谢。我刚刚开始使用这些东西,所以它有点困难:)所以我不能真正设置父手动? – SaintHUN 2011-04-16 14:22:57

+0

您可以设置父级,但是当父级是控制本身时,您希望发生什么?一些属性也会看父母以找到他们的价值 - 这些将通过这种方式进入无限循环。 – 2011-04-16 14:26:56

你需要添加更多关于你想要实现的信息。

既然这样你的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