2008-10-31 5 views
4

Je souhaite créer une sous-classe de TabPage qui contient un certain contrôle et je souhaite contrôler la disposition et les propriétés de ces contrôles via le concepteur. Cependant, si j'ouvre ma sous-classe dans le concepteur, je ne peux pas les positionner comme je le pourrais sur un UserControl. Je ne veux pas avoir à créer un TabPage avec une instance UserControl dessus, je veux concevoir le TabPage directement.Comment créer une sous-classe de TabPage que je peux éditer comme un UserControl?

Comment faire cela? J'ai essayé de changer les attributs Designer et DesignerCategory, mais je n'ai trouvé aucune valeur qui aide.

Répondre

9

J'ai eu un problème similaire dans le passé.

Ce que j'ai d'abord été passer de héritant Usercontrol à TabPage comme si

classe InterfaceUtilisateur: UserControl // Do peu concepteur puis changer pour

classe InterfaceUtilisateur: TabPage

Second je viens juste tous mes contrôles et d'autres choses dans la commande usercontrol et amarré cela dans un onglet.

troisième j'ai fait une classe générique qui prend n'importe quel usercontrol et fait le docking automatiquement.

afin que vous puissiez prendre votre « InterfaceUtilisateur » classe et juste obtenir un type que vous pouvez ajouter à un System.Windows.Forms.TabControl

public class UserTabControl<T> : TabPage 
    where T : UserControl, new() 
{ 
    private T _userControl; 
    public T UserControl 
    { 
     get{ return _userControl;} 
     set 
     {   
      _userControl = value; 
      OnUserControlChanged(EventArgs.Empty); 
     } 
    } 
    public event EventHandler UserControlChanged; 
    protected virtual void OnUserControlChanged(EventArgs e) 
    { 
     //add user control docked to tabpage 
     this.Controls.Clear();  
     UserControl.Dock = DockStyle.Fill; 
     this.Controls.Add(UserControl); 

     if (UserControlChanged != null) 
     { 
      UserControlChanged(this, e); 
     } 
    } 

    public UserTabControl() : this("UserTabControl") 
    { 
    } 

    public UserTabControl(string text) 
     : this(new T(),text) 
    { 
    } 

    public UserTabControl(T userControl) 
     : this(userControl, userControl.Name) 
    { 
    } 

    public UserTabControl(T userControl, string tabtext) 
     : base(tabtext) 
    { 
     InitializeComponent(); 
     UserControl = userControl; 
    } 

    private void InitializeComponent() 
    { 
     this.SuspendLayout(); 
     // 
     // UserTabControl 
     // 

     this.BackColor = System.Drawing.Color.Transparent; 
     this.Padding = new System.Windows.Forms.Padding(3); 
     this.UseVisualStyleBackColor = true; 
     this.ResumeLayout(false); 
    } 
} 
+0

J'ai travaillé pour moi! Honte personne n'a accepté cette réponse. – dcg

+0

La partie la plus importante est de passer de TabPage à UserControl. Pour une raison quelconque, Visual Studio n'affiche pas le contrôle dans le concepteur s'il hérite de TabPage. Passer à UserControl résout ceci immédiatement. Maintenant, il apparaît également dans la boîte à outils. – lanoxx

+0

Génie, résolu tout en même temps. – jkokorian

1

Je gère en concevant les pages elles-mêmes comme des formes individuelles, qui sont ensuite hébergés dans des pages à onglet lors de l'exécution.

Comment mettre un formulaire à l'intérieur d'un TabPage?

form.TopLevel = false; 
form.Parent = tabPage; 
form.FormBorderStyle = FormBorderStyle.None; // otherwise you get a form with a 
              // title bar inside the tab page, 
              // which is a little odd 
+0

Je ne vois pas d'amélioration sur l'utilisation d'un UserControl. – Simon

+0

Je suis d'accord. L'utilisation d'un formulaire est excessive, utilisez simplement un UserControl. –

+0

L'exemple de code n'est pas suffisant pour obtenir un formulaire à afficher dans un TabPage. Je l'ai essayé, compilé et exécuté, mais la page à onglet était vide. –

Questions connexes