Note 1: The result reported here is a
hypothesis based on testing in Visual Studio Pro 2010, with the WinForms project set to compile against .NET FrameWork 4 Client Profile, only.
Note 2: This tip does not consider using Component Classes which are sub-classed as Containers. Only
UserControl
is discussed here.
Note 3: I appreciate all feedback, and correction, on the content of this Tip: hypothesis refutation welcome.
Background
0. Consider the action of drag-dropping a Control from the ToolBox onto a Panel, or GroupBox, on a Form at DesignTime: you will get visual feedback from the drop target, and the dropped Control will become a child of the
Panel
or
GroupBox
.
However, if you create a
UserForm
in a WinForms .NET solution, and then build the project, and then drag-drop an instance of the
UserControl
on a
Form
from the
ToolBox
: it will not 'accept' ('swallow' may be a better term)other Controls: in other words, the drag-dropped Controls will not become 'child' controls of the
UserControl
: rather, they will become 'child' Controls of the Form. And you do not have any visual feedback as you do when you drag-drop to a
Panel
, or other Container Control.
- An early Microsoft tech-note(1)[^] showed how to make a
UserControl
at DesignTime
in a Windows Form 'accept' Controls drag-dropped from the ToolBox. This was accomplished by using the IDesigner
attribute.
- In 2009, Henry Minute published a CodeProject article(2)[^] addressing the problem that a UserControl placed on a Windows Form at DesignTime inside another UserForm (i.e., nested) could not have new controls drag-dropped to it from the Visual Studio Toolbox, and have the
UserControl
'accept' these dragged Controls as 'child' controls of the UserForm
: these dragged Controls would remain 'child' controls of the Parent Form.
Something appears to have changed in VS 2010
0. adorning a
UserControl
with the
IDesigner
Attribute like this:
using System.ComponentModel.Design
namespace yourForm_NameSpace
{
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
public partial class yourUserControl: UserControl
{
}
}
- As expected (based on the Microsoft tech-note cited: (1)): you now will find that you can drag-drop other Controls onto the top-level UserForm at DesignTime, and get DesignTime feedback.
- What is not expected: you can nest instances of this
UserControl
inside other instances of this UserControl
, and you will still be able to drag-drop new Controls from the ToolBox onto the nested UserControl
s, and get Design-Time feedback, as if you were drag-dropping.
- What is also not expected: you can drag-drop a Control onto the Form surface, and then move it inside a top-level or nested
UserControl
adorned with the IDesigner
Attribute, and it will be automatically 're-Parented:' however, you will not get the Design-Time drag-feedback you do when you drag-drop from the 'ToolBox.
Hypothesis
VS 2010 Pro, Windows Forms, now makes it easier to deal with DesignTime support ... via drag-drop of Controls from the ToolBox ... of nested
UserControl
s without going to the lengths that Henry Minute went to in 2009 ... of implementing some complex DesignerProvider code ... in his excellent CodeProject article cited here(2).