2009-07-29 7 views
1

J'ai un contrôle dont j'ai besoin pour restreindre les types de contrôles enfants qu'il peut contenir pendant la conception (en faisant glisser un nouveau contrôle sur un contrôle existant sur le concepteur de formulaires). J'ai essayé de le faire en remplaçant l'événement OnControlAdded:Comment supprimer un contrôle si ce n'est un type spécifique?

Protected Overrides Sub OnControlAdded(ByVal e As System.Windows.Forms.ControlEventArgs) 
    MyBase.OnControlAdded(e) 

    If e.Control.GetType() IsNot GetType(ExpandablePanel) Then 
     MsgBox("You can only add the ExpandablePanel control to the TaskPane.", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "TaskPane") 

     Controls.Remove(e.Control) 
    End If 
End Sub 

Cela semble fonctionner, mais je reçois un message d'erreur de Visual Studio immédiatement après le contrôle est supprimé:

« enfant » est pas un enfant le contrôle de ce parent.

Qu'est-ce que cela signifie? Comment puis-je accomplir cela sans erreurs?

Répondre

1

Généralement, vous voulez gérer cela à deux endroits: le ControlCollection et dans un concepteur personnalisé.

Dans votre contrôle:

[Designer(typeof(MyControlDesigner))] 
class MyControl : Control 
{ 
    protected override ControlCollection CreateControlsInstance() 
    { 
     return new MyControlCollection(this); 
    } 

    public class MyControlCollection : ControlCollection 
    { 
     public MyControlCollection(MyControl owner) 
      : base(owner) 
     { 
     } 

     public override void Add(Control control) 
     { 
      if (!(control is ExpandablePanel)) 
      { 
       throw new ArgumentException(); 
      } 

      base.Add(control); 
     } 
    } 
} 

Dans votre concepteur personnalisé:

class MyControlDesigner : ParentControlDesigner 
{ 
    public override bool CanParent(Control control) 
    { 
     return (control is ExpandablePanel); 
    } 
} 
+0

+1 pour la CanParent, mais il dit encore "n'est pas un contrôle enfant". Il serait plus utile de pouvoir émettre un message "Vous ne pouvez pas héberger un X sur un Y" – smirkingman

Questions connexes