C#  - Criando um UserControl :  CheckedComboBox


Hoje vamos recordar como criar um controle personalizado na linguagem C#.

Eu já apresentei este recurso neste artigo: C# - Criando Controles Personalizados (User Control)

E hoje veremos como criar um controle que herda do controle ComboBox. Vamos criar um controle que é um combobox com um checkedbox.

Para isso vamos criar um novo projeto para Windows do tipo Desktop no VS 2019 Community chamado WF_CheckedCombobox usando a linguagem C#:

A seguir vamos incluir um projeto do tipo Windows Forms Control Library que vamos chamar de CheckedCombobox neste projeto Windows Forms usando o menu File -> Add Project:

No projeto CheckedCombobox  vamos criar uma classe CheckComboBox com o código abaixo:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace CheckedComboBox
{
    public class CheckComboBox : ComboBox
    {
        public class ComboboxData
        {
            //string TotalData;
            private bool _checked;
            public bool Checked
            {
                set { _checked = value; }
                get { return _checked; }
            }

            private string _data;
            public string Data
            {
                set { _data = value; }
                get { return _data; }
            }

            public ComboboxData(string value, bool ischeck)
            {
                Data = value;
                Checked = ischeck;
            }

            public override string ToString()
            {
                return Data;
            }
        }
        public event EventHandler Checkchanged;

        public CheckComboBox()
        {
            this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
        }

        public List<ComboboxData> CheckItems
        {
            get
            {
                List<ComboboxData> newitems = new List<ComboboxData>();
                foreach (var item in Items)
                {
                    if (item is ComboboxData)
                    {
                        newitems.Add(item as ComboboxData);
                    }
                }
                return newitems;
            }
        }

        protected override void OnSelectedIndexChanged(EventArgs e)
        {
            base.OnSelectedIndexChanged(e);
            ComboboxData data = (ComboboxData)SelectedItem;
            data.Checked = !data.Checked;

            if (Checkchanged != null)
            {
                Checkchanged(data, e);
            }
        }
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
          if (e.Index == -1)
          {
                return;
          }

          if (Items[e.Index] is ComboboxData)
          {
                ComboboxData data = Items[e.Index] as ComboboxData;
                CheckBoxRenderer.RenderMatchingApplicationState = true;
            CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(e.Bounds.X, e.Bounds.Y), e.Bounds, data.Data, this.Font,
                    (e.State & DrawItemState.Focus) == 0, data.Checked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal);
            }
            else
            {
             e.Graphics.DrawString(Items[e.Index].ToString(), this.Font, Brushes.Black, new Point(e.Bounds.X, e.Bounds.Y));
             return;
            }
            base.OnDrawItem(e);
        }
    }
}

 

Esta classe herda da classe ComboBox e implementa um checkedbox que permite a seleção.

Agora compile o projeto e retorne para o projeto Windows Forms e abra o formulário Form1.cs:

Você verá que ToolBox o controle CheckComboBox aparece e pode ser arrastado para  o formulário:

A seguir inclua o código abaixo no formulário Form1.cs para testar:

using CheckedComboBox;
using System.Windows.Forms;
namespace WF_CheckedComboBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckComboBoxControl();
        }
        private void CheckComboBoxControl()
        {
            checkComboBox1.Items.Add(new CheckComboBox.ComboboxData("Macoratti", true));
            checkComboBox1.Items.Add(new CheckComboBox.ComboboxData("Curso Blazor", false));
            checkComboBox1.Items.Add(new CheckComboBox.ComboboxData("Curso ASP .NET Core", true));
            checkComboBox1.Items.Add(new CheckComboBox.ComboboxData("Curso Web API Essencial", true));
        }
    }
}

Executando o projeto iremos obter:

Fique à vontade para implementar mais recursos...

Pegue o código completo do projeto aqui:  WF_CheckedComboBox.zip

"(Disse Jesus)Passará o céu e a terra, mas as minhas palavras não hão de passar."
Lucas 21:33

Referências:


José Carlos Macoratti