Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / WinForms

DesignTime adding of Controls to a UserForm on a WinForm

4.67/5 (5 votes)
15 Jul 2011CPOL2 min read 38K  
An interesting change in behavior in VS 2010 Pro ?
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.
  1. 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.
  2. 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:
// you must have a reference set to System.ComponentModel.Design;
using System.ComponentModel.Design
//
namespace yourForm_NameSpace
{   
//
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
    public partial class yourUserControl: UserControl
    {
      // your UserControl code
    }
}

  1. 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.

  2. 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 UserControls, and get Design-Time feedback, as if you were drag-dropping.

  3. 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 UserControls 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).

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)