Eigenes Steuerelement, das ausschließlich spezielle Controls enthalten darf.



  • Hallo,

    wie kann ich ein eigenes Steuerelement entwerfen, das ausschließlich spezielle Controls enthalten darf.

    Wenn ich von UserControl erbe, so erbe ich auch das Property Controls, über das jegliches Control hinzugefügt werden kann. Wie kann ich es aber nun bewerkstelligen, daß ich z.B. nur Instanzen der Klasse MyClass hinzufügen kann?

    Die Überprüfung soll hier zur Compilezeit und nicht zur Laufzeit erfolgen.

    Danke!



  • Hallo,

    Ich kann dirleider nicht ganz folgen.
    Also du erzeugst ein UserControl, bestückst es mit Controls aus System.Windows.Forms, bzw. selbst gebauten Custom Contols.
    Wenn jemand das erzeugte assembly in seiner Applikation verwendet, was soll er dann hinzufügen?
    Er könnte ein eigenes UserControl von deinem ableiten, das kannst du verhindern, indem du die Klasse versiegelst.

    Und für dich selbst psiewlt es doch keine Rolle, was du zufügen darfst, dumusst es ja nicht machen. Vielleicht kannst du dein problem etwas näher erklären.



  • Beispiel ContextMenu:

    Derjenige, der diese Klasse entwickelt hat, hat sichergestellt, dass man einem ContextMenu nur MenuItems oder Subklassen davon hinzufügen kann und keine anderen.

    Wie kann ich so etwas bewerkstelligen? Ich möchte ein Steuerelement entwickeln, das über den Designer zur Designzeit bearbeitet werden kann, dem aber nur spezielle Objekte hinzugefügt werden können, s.o.

    Dazu müsste ich eine Klasse schreiben, die nicht von UserControl erbt, sondern kapselt. Dadurch verliere ich aber die Designfähigkeit von UserControl. Was ist es Rätsels Lösung?



  • Des Rätsels Lösung ist, du musst deinen eigenen Collection-Typ definieren und in der abgeleiteten Klasse die Controls-Property neu definieren. Hier ein kleines Beispiel:

    class MyUserControlItem:UserControl
    {
    }
    class MyItemCollection
    {
    	private ArrayList _alItems;
    
    	public MyUserControlItem this[int index]
    	{
    		get
    		{
    			return (MyUserControlItem)_alItems[index];
    		}
    		set
    		{
    			_alItems[index]=value;
    		}
    	}
    
    	public MyItemCollection()
    	{
    		_alItems=new ArrayList();
    	}
    
    	public void Add(MyUserControlItem item)
    	{
    		_alItems.Add(item);
    	}
    }
    class MyUserControl:UserControl
    {
    	private MyItemCollection _items;
    
    	public new MyItemCollection Controls
    	{
    		get
    		{
    			return _items;
    		}
    	}
    
    	public MyUserControl()
    	{
    		_items=new MyItemCollection();
    	}
    }
    
    class Class1
    {		
    	[STAThread]
    	static void Main(string[] args)
    	{
    		MyUserControl ctrl = new MyUserControl();
    		ctrl.Controls.Add(new MyUserControlItem());
    	}		
    }
    

Anmelden zum Antworten