2017-07-20 5 views
1

Je crée mon propre TabControl avec des pages personnalisées. Ça avance bien sauf pour la partie suppression. Lorsque j'ajoute TabControl à un formulaire dans le concepteur tout fonctionne bien, 2 TabPages par défaut sont ajoutés et le contrôle est dessiné. Mais lorsque je supprime TabControl du formulaire dans le concepteur, les TabPages qui font partie de la collection TabControl.Controls ne sont pas supprimés du code du concepteur. Ils perdent juste leur parent.Supprimer les contrôles enfants à partir du code de concepteur

Des pensées?

Pour la création, j'utilise le code suivant.

public class CustomTabControlDesigner : ParentControlDesigner 
{ 
    DesignerVerbCollection _fVerbs; 
    public override DesignerVerbCollection Verbs 
    { 
     get 
     { 
      if (_fVerbs == null) 
      { 
       _fVerbs = new DesignerVerbCollection(new[] { new DesignerVerb("Add Tab", OnAdd), new DesignerVerb("Del Tab", OnDel) }); 
      } 

      return _fVerbs; 
     } 
    } 

    void OnAdd(object sender, EventArgs e) 
    { 
     IDesignerHost designerHost = (IDesignerHost)GetService(typeof(IDesignerHost)); 
     if (designerHost != null) 
     { 
      WTabPage newPage = (WTabPage)designerHost.CreateComponent(typeof(WTabPage)); 
      //newPage.Text = newPage.Name; 

      ((WTab)Component).Controls.Add(newPage); 
     } 
    } 
    void OnDel(object sender, EventArgs e) 
    { 
     IDesignerHost designerHost = (IDesignerHost)GetService(typeof(IDesignerHost)); 
     if (designerHost != null) 
     { 
      ((WTab)Component).Controls.Remove(((WTab)Component).SelectedTab); 
     } 
    } 

    public override void InitializeNewComponent(IDictionary defaultValues) 
    { 
     base.InitializeNewComponent(defaultValues); 

     for (int i = 0; i < 2; i++) 
     { 
      OnAdd(this, EventArgs.Empty); 
     } 
    } 
    //protected override void Dispose(bool disposing) 
    //{ 
    // for (int i = ((WTab)Component).Controls.Count - 1; i >= 0; i--) 
    // { 
    //  ((WTab)Component).Controls.Remove(((WTab)Component).Controls[i]); 
    // } 

    // base.Dispose(disposing); 
    //} 

    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 

     // Selection of tabs via mouse 
     if (m.Msg == 0x201/*WM_LBUTTONDOWN*/) 
     { 
      WTab control = (WTab)Component; 

      int lParam = m.LParam.ToInt32(); 

      Point hitPoint = new Point(lParam & 0xffff, lParam >> 0x10); 

      if (Control.FromHandle(m.HWnd) == null) // Navigation 
      { 
       if (hitPoint.X < 18 && control.SelectedIndex > 0) // Left 
       { 
        control.SelectedIndex--; 
       } 

       else 
       { 
        control.SelectedIndex++; // Right} 
       } 
      } 
      else 
      { 
       // Header click 
       for (int i = 0; i < control.TabCount; i++) 
       { 
        if (control.GetTabRect(i).Contains(hitPoint)) 
        { 
         control.SelectedIndex = i; 

         return; 
        } 
       } 
      } 
     } 
    } 
    protected override void OnDragDrop(DragEventArgs de) 
    { 
     ((IDropTarget)((WTab)Component).SelectedTab).OnDragDrop(de); 
    } 
    protected override void OnDragEnter(DragEventArgs de) 
    { 
     ((IDropTarget)((WTab)Component).SelectedTab).OnDragEnter(de); 
    } 
    protected override void OnDragLeave(EventArgs e) 
    { 
     ((IDropTarget)((WTab)Component).SelectedTab).OnDragLeave(e); 
    } 
    protected override void OnDragOver(DragEventArgs de) 
    { 
     ((IDropTarget)((WTab)Component).SelectedTab).OnDragOver(de); 
    } 
} 

Le onAdd et Ondel sont triggerd par les tâches non lorsque la commande est ajoutée ou supprimée: Task Img

+0

pourrait-il, que vous devez remplacer '((WTab) Component) .Controls.Remove (((WTab) Component) .SelectedTab)' dans '' OnDel' avec ((WTab) Component). Controls.Clear(); '? –

+0

La méthode OnDel n'est pas déclenchée lorsque le contrôle est effacé à ma connaissance, il est utilisé dans les Tâches TabControl lorsque vous appuyez sur le triangle en haut à droite. –

+0

Remplacez-vous la méthode Dispose de 'WTab'? Pouvez-vous poster le code de vos contrôles 'WTab' et' WTabPage'? En particulier le code où les pages sont ajoutées/supprimées et toutes les méthodes de disposition. –

Répondre

0

Basé sur @Pablo notPicasso sa réponse j'ai utilisé le code suivant qui semble fonctionner. Des torts dans cela?

 protected override void Dispose(bool disposing) 
    { 
     IDesignerHost designerHost = (IDesignerHost)GetService(typeof(IDesignerHost)); 
     if (designerHost != null) 
     { 
      for (int i = ((WTab)Component).Controls.Count - 1; i >= 0; i--) 
      { 
       // 
       var tab = ((WTab)Component).Controls[i]; 

       // 
       ((WTab)Component).Controls.Remove(tab); 

       // 
       designerHost.DestroyComponent(tab); 
      } 
     } 

     base.Dispose(disposing); 
    } 
0

Avez-vous essayé IDesignerHost.DestroyComponent(...)?

void OnDel(object sender, EventArgs e) 
{ 
    IDesignerHost designerHost = (IDesignerHost) GetService(typeof(IDesignerHost)); 
    if (designerHost != null) 
    { 
     var tab = ((WTab) Component).SelectedTab; 
     ((WTab) Component).Controls.Remove(tab); 
     designerHost.DestroyComponent(tab); 
    } 
} 
+0

L'OnDel n'est pas déclenché lorsque le TabControl est supprimé du formulaire, il est utilisé pour les tâches de contrôle. Exemple: https://i.stack.imgur.com/YQ4Y7.png –