2017-07-20 3 views
1

Ich erstelle meine eigenen TabControl mit benutzerdefinierten TabPages. Es kommt gut voran, bis auf den Löschteil. Wenn ich das TabControl zu einem Formular im Designer hinzufüge, funktioniert alles gut, 2 Standard-TabPages werden hinzugefügt und das Steuerelement wird gezeichnet. Aber wenn ich das TabControl aus dem Formular im Designer lösche, werden die TabPages, die Teil der TabControl.Controls Collection sind, nicht aus dem Designer Code gelöscht. Sie verlieren nur ihre Eltern.Löschen Sie Child Controls aus Designer-Code

Irgendwelche Gedanken?

Für die Erstellung verwende ich den folgenden Code.

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); 
    } 
} 

Die onAdd und Ondel nicht von den Aufgaben getriggert werden, wenn die Steuerung hinzugefügt oder entfernt wird: Task Img

+0

Könnte es sein, dass Sie ersetzen sollte '((WTab) Component) .Controls.Remove (((WTab) Komponente) .SelectedTab);' in 'OnDel' mit' ((WTab) Komponente). Controls.Clear(); '? –

+0

Die OnDel-Methode wird nicht ausgelöst, wenn das Steuerelement nach meinem Verständnis gelöscht wird. Sie wird in den TabControl-Aufgaben verwendet, wenn Sie auf das Dreieck rechts oben drücken. –

+0

Überschreiben Sie die Dispose-Methode von 'WTab'? Können Sie Code Ihrer Steuerelemente 'WTab' und' WTabPage' posten? Vor allem Code, wo Seiten hinzugefügt/entfernt werden und alle Entsorgungsmethoden. –

Antwort

0

Basierend auf @Pablo nichtPicasso seine Antwort Ich habe den folgenden Code verwendet, der zu funktionieren scheint. Irgendwelche Fehler in diesem?

 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

Sie IDesignerHost.DestroyComponent(...) versucht haben?

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

Der OnDel wird nicht ausgelöst, wenn das TabControl aus dem Formular gelöscht wird, es wird für die Steuerungsaufgaben verwendet. Beispiel: https://i.stack.imgur.com/YQ4Y7.png –

Verwandte Themen