Auto-generate the code-behind name of designer collection items

c#, designer, winforms

Solution

You can try inheriting from Component to get that feature.

In this example, I created a class called `PanelItem`, which will be the class used in my collection by my own Panel class. I added `DesignTimeVisible(false)` so that it doesn't populate the component tray in the designer.

Also, I added a `Name` property that is hidden from the designer but can be used in code. It seemed to work in my tests:

[DesignTimeVisible(false)]
public class PanelItem : Component  {

  [DefaultValue(typeof(string), "")]
  public string PanelText { get; set; }

  private string name = string.Empty;

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public string Name {
    get {
      if (base.Site != null) {
        name = base.Site.Name;
      }
      return name;
    }
    set {
      name = value;
    }
  }
}

Then my custom panel control:

public class MyPanel : Panel {
  private List<PanelItem> panelItems = new List<PanelItem>();

  [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  public List<PanelItem> PanelItems {
    get { return panelItems; }
  }
}

Resulted in:

Problem

I have a custom control with a public collection marked as `DesignerSerializationVisibility.Content`. When I add items to the collection using the designer, it adds them to the designer file and assigns all desired values but it gives each element of the collection a generic name, such as `MyClass1`, `MyClass2`, etc. I want the "Name" property of each item to become the code name of the item so that I can then access the item by its name in code. This is the functionality of how a ContextMenuStrip and ToolStrip works. In those cases, the Name property shows up as `(Name)` in the property grid. Is there an attribute or something I can use to gain this functionality? Or do I have to write a whole custom designer dialog? If so, what's an example of the simplest way I could go about achieving this?

Original source