2009-08-31 5 views
7

Je crée mon propre contrôle utilisateur qui contient uniquement un panneau:C# contrôle utilisateur comme un panneau personnalisé

Quand je fais glisser un objet MyPanel dans le concepteur et puis essayer d'ajouter un bouton dessus, le bouton est en fait ajouté aux contrôles du formulaire.

Y at-il une propriété/attribut que je dois définir pour effectuer cela, une autre façon de faire ce que je veux?

public class MyPanel : UserControl 
{ 
    private Panel panelMain; 

    public MyPanel() 
    { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() 
    { 
     this.panelMain = new System.Windows.Forms.Panel(); 
     this.SuspendLayout(); 
     // 
     // panelMain 
     // 
     this.panelMain.BackColor = System.Drawing.SystemColors.ActiveCaption; 
     this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.panelMain.Location = new System.Drawing.Point(0, 0); 
     this.panelMain.Name = "panelMain"; 
     this.panelMain.Size = new System.Drawing.Size(150, 150); 
     this.panelMain.TabIndex = 0; 
     // 
     // myPanel 
     // 
     this.Controls.Add(this.panelMain); 
     this.Name = "MyPanel"; 
     this.ResumeLayout(false); 
    } 
} 

Répondre

2

Pour être plus précis, je fais ce qui suit:

[Designer(typeof(myControlDesigner))] 
public class MyPanel : UserControl 
{ 
    private TableLayoutPanel tableLayoutPanel1; 
    private Panel panelMain; 
    ... 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public Panel InnerPanel 
    { 
     get { return panelMain; } 
     set { panelMain = value; } 
    } 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public TableLayoutPanel InnerTableLayout 
    { 
     get { return tableLayoutPanel1; } 
     set { tableLayoutPanel1 = value; } 
    } 
} 

Avec myControlDesigner pour [Designer (typeof (myControlDesigner))] pour être

class myControlDesigner : ParentControlDesigner 
{ 

    public override void Initialize(IComponent component) 
    { 

     base.Initialize(component); 

     MyPanel myPanel = component as MyPanel; 
     this.EnableDesignMode(myPanel.InnerPanel, "InnerPanel"); 
     this.EnableDesignMode(myPanel.InnerTableLayout, "InnerTableLayout"); 

    } 

} 

(Autre source: Add Control to UserControl)

+0

J'ai utilisé votre approche pour créer un panneau personnalisé. Mais, lorsque j'utilise ce panneau personnalisé dans un autre contrôle utilisateur, lorsque je fais glisser des contrôles sur le panneau dans le concepteur, ils apparaissent initialement. Mais, quand je recompile, ils disparaissent. Ils sont toujours là mais il semble que le panneau personnalisé soit dessiné dessus/après eux. Avez-vous eu ce genre de problème? J'utilise VS 2005/.NET 2.0. – bsh152s

+0

Non Je ne me souviens pas d'avoir ce genre de problème, avez-vous un petit échantillon? – Toto

+3

@ bsh152s C'est une très vieille réponse mais je voulais parler du problème des 'contrôles perdus': Le Panel/TableLayout qui est exposé doit être publiquement exposé (modificateur public). Dans mon utilisation de ce code, j'ai également ajouté [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] pour que Visual Studio sérialise les modifications. –

Questions connexes