Custom Controls in C# Windows Forms

Creating custom controls in C# Windows Forms can significantly enhance the user experience by providing tailored functionalities that are not available in the standard set of controls. This article will guide you through the process of creating custom controls, extending existing ones, and incorporating them into your Windows Forms applications.

Why Custom Controls?

Custom controls are beneficial when you need specific behavior or appearance that standard controls cannot provide. They help you.

  • Encapsulate reusable logic
  • Simplify your forms by combining multiple controls into one
  • Create a unique look and feel for your application

Types of Custom Controls

  1. Derived Controls: Extend existing controls and override their behavior or appearance.
  2. Composite Controls: Combine multiple existing controls into a single reusable control.
  3. Owner-Drawn Controls: Provide custom rendering logic for existing controls.

Creating a Simple Derived Control

Let's start by creating a simple derived control. We'll extend the standard Button control to create a custom button with additional properties.

Step 1. Create a New Control Class

  1. Open your Windows Forms project in Visual Studio.
  2. Add a new class to your project (e.g., CustomButton.cs).
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    namespace CustomControls
    {
        public class CustomButton : Button
        {
            public Color HoverColor { get; set; } = Color.Yellow;
            private Color originalColor;
    
            protected override void OnMouseEnter(EventArgs e)
            {
                base.OnMouseEnter(e);
                originalColor = this.BackColor;
                this.BackColor = HoverColor;
            }
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                this.BackColor = originalColor;
            }
        }
    }
    

Step 2. Use your Custom Control

  1. Build your project to compile the new control.
  2. Open the form designer, and you will see CustomButton in the Toolbox.
  3. Drag and drop CustomButton onto your form, or add it programmatically.
    CustomButton customButton = new CustomButton
    {
        Text = "Hover Me",
        Size = new Size(100, 50),
        Location = new Point(50, 50),
        HoverColor = Color.LightBlue
    };
    this.Controls.Add(customButton);
    

Creating a Composite Control

Next, let's create a composite control that combines a TextBox and a Button. This control will serve as a search box with a button to trigger the search.

Step 1. Create a New UserControl

Add a new UserControl to your project (e.g., SearchBox.cs).

Step 2. Design the Control

  1. Open the SearchBox in the designer.
  2. Drag a TextBox and a Button onto the control.
  3. Arrange them as desired.

Step 3. Add Custom Properties and Events

using System;
using System.Windows.Forms;
namespace CustomControls
{
    public partial class SearchBox : UserControl
    {
        public string SearchText
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }
        public event EventHandler SearchClicked;
        public SearchBox()
        {
            InitializeComponent();
            button1.Text = "Search";
            button1.Click += (s, e) => SearchClicked?.Invoke(this, e);
        }
    }
}

Step 4. Use Your Composite Control

  1. Build your project.
  2. Open the form designer, and you will see SearchBox in the Toolbox.
  3. Drag and drop SearchBox onto your form, or add it programmatically.
    SearchBox searchBox = new SearchBox
    {
        Size = new Size(200, 30),
        Location = new Point(50, 50)
    };
    searchBox.SearchClicked += (s, e) => MessageBox.Show($"Searching for: {searchBox.SearchText}");
    this.Controls.Add(searchBox);
    
    

Owner-Drawn Controls

For more complex customization, you might need to create owner-drawn controls. Here’s an example of a custom list box with owner-drawn items.

Step 1. Create the Owner-Drawn Control

Add a new class to your project (e.g., CustomListBox.cs).

using System;
using System.Drawing;
using System.Windows.Forms;
namespace CustomControls
{
    public class CustomListBox : ListBox
    {
        public CustomListBox()
        {
            this.DrawMode = DrawMode.OwnerDrawFixed;
            this.ItemHeight = 30;
        }
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            if (e.Index < 0) return;
            e.DrawBackground();
            e.DrawFocusRectangle();

            string text = this.Items[e.Index].ToString();
            e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds);
            base.OnDrawItem(e);
        }
    }
}

Step 2. Use the Owner-Drawn Control

  1. Build your project.
  2. Open the form designer, and you will see CustomListBox in the Toolbox.
  3. Drag and drop CustomListBox onto your form, or add it programmatically.
    CustomListBox customListBox = new CustomListBox
    {
        Size = new Size(200, 150),
        Location = new Point(50, 50)
    };
    customListBox.Items.Add("Item 1");
    customListBox.Items.Add("Item 2");
    customListBox.Items.Add("Item 3");
    this.Controls.Add(customListBox);
    
    

Conclusion

Creating custom controls in C# Windows Forms allows you to enhance the functionality and user experience of your applications. By extending existing controls, combining multiple controls into a composite control, or implementing owner-drawn controls, you can achieve a high level of customization tailored to your specific needs. Start by experimenting with simple derived controls and gradually move to more complex scenarios as you become more comfortable with the process. Happy coding!


Similar Articles