Tip CustomCollectionEditor - Customize the look and feel


Active member
Sep 8, 2020
Programming Experience
I wanted to be able to control most of the aspects of the Collection Editor. First, I will admit, most of the ideas presented here came from various posts and examples found scouring the web. At this point, I don't remember where each idea came from, so if any of them are yours, let me know and I'll add credit in this post. Anyway, I will simply post the CustomerCollectionEditor. Comments explain most of what it is doing. If you need more clarification, just send me a note. I got help on setting the Font of the various items within the CustomCollectionEditor from the Forum Moderator John H. I also got help re-sizing the "listbox" from another Forum's user Reza Aghaei. Below is the code and an image of the customizations.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
using System.ComponentModel.Design;
using System.Windows.Forms;

namespace FirstPassYield
    public class MyCollectionEditor : CollectionEditor
        public static bool bEditingCollection = false;

        public delegate void MyFormClosedEventHandler(object sender, FormClosedEventArgs e);

        public event MyFormClosedEventHandler MyFormClosed;

        public delegate void MyFormLoadEventHandler(object sender, System.EventArgs e);

        public event MyFormLoadEventHandler MyFormLoad;

        public delegate void MyFormControlAddedEventHandler(object sender, System.EventArgs e);

        public event MyFormControlAddedEventHandler MyFormControlAdded;

        public MyCollectionEditor(Type type)
            : base(type)

        protected override string GetDisplayText(object value)
            Defect item = new Defect();
            item = (FirstPassYield.Defect)value;

            if (String.IsNullOrEmpty(item.DefectCode))
                return base.GetDisplayText(" ");
                String sDisplay = item.DefectCode.ToString().Substring(0, item.DefectCode.ToString().IndexOf(":"));
                return base.GetDisplayText(string.Format("{0}", sDisplay));

        protected override CollectionForm CreateCollectionForm()
            CollectionForm collectionForm = base.CreateCollectionForm();
            Font myDialogFont = new Font("Microsoft San Seraf", 9.0f, FontStyle.Bold); // Form's Font
            Font myFont = new Font("Microsoft San Seraf", 9.0f, FontStyle.Bold);       // Individual Item's Font

            // Set the Dialog Font
            collectionForm.Font = myDialogFont;

            // Turn OFF Help Button
            collectionForm.HelpButton = false;

            // Set the BackColor, StartPosition and Size of the form
            collectionForm.BackColor = Color.FromName("SteelBlue");
            collectionForm.StartPosition = FormStartPosition.CenterParent;
            collectionForm.Size = new Size(660, 500);

            // Add Form Handlers for trapping Load and Close
            collectionForm.FormClosed += this.collection_FormClosed;
            collectionForm.Load += this.collection_FormLoad;

            var overArchingTableLayoutPanel = collectionForm.Controls["overArchingTableLayoutPanel"];

            // Change the size of the "listbox"
            Size mySize = new Size(150, 337);
            overArchingTableLayoutPanel.Controls["listbox"].Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left;
            overArchingTableLayoutPanel.Controls["listbox"].Size = mySize;

            var addRemoveTableLayoutPanel = overArchingTableLayoutPanel.Controls["addRemoveTableLayoutPanel"];
            // Change the width of the Add/Remove Buttons to match the new "listbox" size
            addRemoveTableLayoutPanel.Controls["addButton"].Anchor = 0;
            addRemoveTableLayoutPanel.Controls["addButton"].Width = addRemoveTableLayoutPanel.Controls["addButton"].Width / 2;
            addRemoveTableLayoutPanel.Controls["removeButton"].Anchor = 0;
            addRemoveTableLayoutPanel.Controls["removeButton"].Width = addRemoveTableLayoutPanel.Controls["removeButton"].Width / 2;
            // Set the BackColor of the Buttons - It appears that they get set by default to the form's BackColor
            addRemoveTableLayoutPanel.Controls["addButton"].BackColor = Color.FromName("Control");
            addRemoveTableLayoutPanel.Controls["removeButton"].BackColor = Color.FromName("Control");
            // Set the Font for the Add, Remove buttons
            addRemoveTableLayoutPanel.Controls["addButton"].Font = myFont;
            addRemoveTableLayoutPanel.Controls["removeButton"].Font = myFont;
            // Add Handlers for trapping Add and Remove Buttons
            addRemoveTableLayoutPanel.Controls["addButton"].Click += AddButton_Click;
            addRemoveTableLayoutPanel.Controls["removeButton"].Click += RemoveButton_Click;

            var okCancelTableLayoutPanel = overArchingTableLayoutPanel.Controls["okCancelTableLayoutPanel"];
            // Set the BackColor of the Buttons - It appears that they get set by default to the form's BackColor
            okCancelTableLayoutPanel.Controls["okButton"].BackColor = Color.FromName("Control");
            okCancelTableLayoutPanel.Controls["cancelButton"].BackColor = Color.FromName("Control");
            // Set the Font for the OK, Cancel buttons
            okCancelTableLayoutPanel.Controls["okButton"].Font = myFont;
            okCancelTableLayoutPanel.Controls["cancelButton"].Font = myFont;
            // Add Handlers for trapping OK and Cancel Buttons
            okCancelTableLayoutPanel.Controls["okButton"].Click += OKButton_Click;
            okCancelTableLayoutPanel.Controls["cancelButton"].Click += CancelButton_Click;

            // Change the Member Labels' Text, Color and Font
            overArchingTableLayoutPanel.Controls["membersLabel"].Text = "&Defect List:";
            overArchingTableLayoutPanel.Controls["membersLabel"].ForeColor = Color.FromName("White");
            overArchingTableLayoutPanel.Controls["membersLabel"].Font = myFont;
            // Change the Properties Labels' Text, Color and Font
            overArchingTableLayoutPanel.Controls["propertiesLabel"].Text = "&Properties:";
            overArchingTableLayoutPanel.Controls["propertiesLabel"].ForeColor = Color.FromName("White");
            overArchingTableLayoutPanel.Controls["propertiesLabel"].Font = myFont;
            // Set the BackColor of the Buttons - It appears that they get set by default to the form's BackColor
            overArchingTableLayoutPanel.Controls["upButton"].BackColor = Color.FromName("Control");
            overArchingTableLayoutPanel.Controls["downButton"].BackColor = Color.FromName("Control");
            // Add Handlers for trapping Up and Down Buttons
            overArchingTableLayoutPanel.Controls["upButton"].Click += UpButton_Click;
            overArchingTableLayoutPanel.Controls["downButton"].Click += DownButton_Click;

            var propertyBrowser = overArchingTableLayoutPanel.Controls["propertyBrowser"] as PropertyGrid;
            if (propertyBrowser.Controls.Count != 0)
                // Set the PropertySorting and ToolbarVisibilty
                propertyBrowser.PropertySort = PropertySort.NoSort;
                propertyBrowser.ToolbarVisible = false;

            // Do something based on which Collection Editor was called
            switch (collectionForm.Text)
                case "Defect Collection Editor":

            // Hide Add, Remove, Up and Down Buttons
            //collectionForm.Controls["overArchingTableLayoutPanel"].Controls["addRemoveTableLayoutPanel"].Controls["addButton"].Visible = false;
            //collectionForm.Controls["overArchingTableLayoutPanel"].Controls["addRemoveTableLayoutPanel"].Controls["removeButton"].Visible = false;
            //collectionForm.Controls["overArchingTableLayoutPanel"].Controls["upButton"].Visible = false;
            //collectionForm.Controls["overArchingTableLayoutPanel"].Controls["downButton"].Visible = false;

            return collectionForm;

        private void collection_FormLoad(object sender, System.EventArgs e)
            bEditingCollection = true;

        private void AddButton_Click(object sender, EventArgs e)
            //MessageBox.Show("Add Button Clicked");

        private void RemoveButton_Click(object sender, EventArgs e)
            //MessageBox.Show("Remove Button Clicked");

        private void OKButton_Click(object sender, EventArgs e)
            //MessageBox.Show("OK Button Clicked");

        private void CancelButton_Click(object sender, EventArgs e)
            //MessageBox.Show("Cancel Button Clicked");

        private void UpButton_Click(object sender, EventArgs e)
            //MessageBox.Show("Up Button Clicked");

        private void DownButton_Click(object sender, EventArgs e)
            //MessageBox.Show("Down Button Clicked");

        private void collection_FormClosed(object sender, FormClosedEventArgs e)
            bEditingCollection = false;

Top Bottom