En este tutorial les voy a mostrar cómo realizar un formulario CRUD (Create, Read, Update, Delete) utilizando el lenguaje de programación C# .NET en Visual Studio. Utilizaremos el NET FRAMEWORK 4.5.2, componentes de ADO.NET, como base de datos usaremos MySQL. El desarrollo de la aplicación tendrá una Arquitectura en Capas (Entidades, Acceso a Datos, Negocio y Presentación) . Además, el diseñaremos una interfaz moderna con las librerías MetroFramework + FontAwesome Icons.

Extra:

  1. Botones de Navegación en Barra de Herramientas para enlazar DataSource con Controles del Formulario
  2. Validaciones de campos obligatorios
  3. Query para generar correlativo de ID
  4. Ejemplo con Procedimiento Almacenado.

Estructura del Proyecto



1. Creación de la Base de Datos

	

create database tutorial;

1.1 Creación de la Tabla Cliente

	

create table Cliente(
	id int not null auto_increment,
	idCliente 	char(7) not null,
	dsCliente 	varchar(100) null,
	dsNumDoc 	varchar(50) null,
	dsSexo char(1) null,
	dsDireccion varchar(100) null,
	dsTelefono 	varchar(100) null,
	dsCorreo 	varchar(100)  null,
	feNacimiento date null,
	dsEstado char(1) not null,
	PRIMARY KEY (idCliente),
	KEY idx_id_cliente(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. Capa de Entidades: Crud.BusinessEntities

2.1 BE_Cliente.cs

Clase que contendrá las propiedades de la entidad Cliente

	
	
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Crud.BusinessEntities
{
    public class BE_Cliente
    {
        public int id { get; set; }
        public string idCliente { get; set; }
        public string dsCliente { get; set; }
        public string dsNumDoc { get; set; }
        public string dsSexo { get; set; }
        public string dsDireccion { get; set; }
        public string dsTelefono { get; set; }
        public string dsCorreo { get; set; }
        public DateTime feNacimiento { get; set; }
        public string dsEstado { get; set; }
    }
}
	

3. Capa de Acceso a Datos: Crud.DataAccess

En esta capa se debe agregar la referencia a la capa de entidades Crud.BusinessEntities y al conector de MySQL (Descargar conector desde la página oficial de MySQL AQUI). Cuando terminan de instalar el conector lo agregan desde Referencia >> Ensamblados >> Extensiones >> MySql.Data

3.1 DA_BaseClass.cs

Clase base que contendrá la cadena de conexión y funciones utilitarias:

	
	
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using MySql.Data.MySqlClient;

namespace Crud.DataAccess
{
    public class DA_BaseClass
    {
        public static string strCadenaConexion = "SERVER=localhost; DATABASE=tutorial;" +
            "UID=userbd; PASSWORD=123456";

        // devuelve un datatable a partir de una sentencia select
        public static DataTable GetDataTable(string strSQL)
        {
            try
            {
                using (MySqlConnection cn = new MySqlConnection(strCadenaConexion))
                {
                    cn.Open();
                    using (MySqlCommand cmd = new MySqlCommand(strSQL,cn))
                    {
                        using (MySqlDataReader dr = cmd.ExecuteReader())
                        {
                            DataTable dt = new DataTable();
                            dt.Load(dr);
                            return dt;
                        }
                    }

                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        //Insert, udpate , delete
        public static bool ExecTransaction(string strSQL)
        {
            bool resultado = false;

            try
            {
                using (MySqlConnection cn = new MySqlConnection(strCadenaConexion))
                {
                    cn.Open();
                    using (MySqlTransaction trx = cn.BeginTransaction())
                    {
                        try
                        {
                            using (MySqlCommand cmd = new MySqlCommand(strSQL, cn))
                            {
                                cmd.Transaction = trx;
                                cmd.ExecuteNonQuery();
                            }
                            trx.Commit();
                            resultado = true;
                        }
                        catch (Exception)
                        {
                            trx.Rollback();
                            resultado = false;
                            throw;
                        }

                    }

                }
            }
            catch (Exception)
            {

                throw;
            }
            return resultado;    
        }

        public static string GetScalar(string strSQL)
        {
            string resultado = string.Empty;
            try
            {
                using (MySqlConnection cn = new MySqlConnection(strCadenaConexion))
                {
                    cn.Open();
                    using (MySqlCommand cmd = new MySqlCommand(strSQL,cn))
                    {
                        var scalar = cmd.ExecuteScalar();
                        resultado = scalar.ToString();
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            return resultado;
        }
    }
}
	

3.2 DA_Cliente.cs

Esta clase heredará de DA_BaseClass.cs y contendrá las funciones necesarias para las operaciones CRUD

	

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Crud.BusinessEntities;
using MySql.Data.MySqlClient;

namespace Crud.DataAccess
{
    public class DA_Cliente:DA_BaseClass
    {
        public static DataTable ListarClientes(string strCliente) 
        {
            string strSQL = "select * from Cliente";
            strSQL += " where dsCliente like '%" + strCliente + "%'";
            strSQL += " order by id desc; ";

            return GetDataTable(strSQL);           
        }

        public static bool InsertaCliente(BE_Cliente Cliente)
        {
            string strSQL = "insert into Cliente(idCliente,dsCliente,dsNumDoc,dsSexo," +
                "dsDireccion,dsTelefono,dsCorreo,feNacimiento,dsEstado) " +
                " values(";
            strSQL += "'" + Cliente.idCliente + "',";
            strSQL += "'" + Cliente.dsCliente + "',";
            strSQL += "'" + Cliente.dsNumDoc + "',";
            strSQL += "'" + Cliente.dsSexo + "',";
            strSQL += "'" + Cliente.dsDireccion + "',";
            strSQL += "'" + Cliente.dsTelefono + "',";
            strSQL += "'" + Cliente.dsCorreo + "',";
            strSQL += "'" + Cliente.feNacimiento.ToString("yyyy-MM-dd") + "',";
            strSQL += "'" + Cliente.dsEstado + "'";
            strSQL += ");";

            return ExecTransaction(strSQL);
        }

        public static bool ActualizarCliente(BE_Cliente Cliente)
        {
            string strSQL = "update Cliente ";
            strSQL += "set dsCliente='" + Cliente.dsCliente + "',";
            strSQL += "dsNumDoc='" + Cliente.dsNumDoc + "',";
            strSQL += "dsSexo='" + Cliente.dsSexo + "',";
            strSQL += "dsDireccion='" + Cliente.dsDireccion + "',";
            strSQL += "dsTelefono='" + Cliente.dsTelefono + "',";
            strSQL += "dsCorreo='" + Cliente.dsCorreo + "',";
            strSQL += "feNacimiento='" + Cliente.feNacimiento.ToString("yyyy-MM-dd") + "',";
            strSQL += "dsEstado='" + Cliente.dsEstado + "'";
            strSQL += " where idCliente = '" + Cliente.idCliente + "';";

            return ExecTransaction(strSQL);
        }

        public static bool EliminarCliente(string idCliente)
        {
            string strSQL = "delete from Cliente";
            strSQL += " where idCliente = '" + idCliente + "';";

            return ExecTransaction(strSQL);
        }

        public static string GenerarIdCliente() 
        {
            string strSQL = "select CONCAT('C',RIGHT(CONCAT('000000',CONVERT(IFNULL(MAX(RIGHT(idCliente,6)),0)+1, CHAR(6))),6)) as ID from cliente;";
            return GetScalar(strSQL);
        }

        // A: Activo , I: Inactivo
        public static DataTable ListarEstado()
        {
            string strSQL = "select 'A' as codigo, 'Activo' as descripcion ";
            strSQL += " union select 'I' as codigo, 'Inactivo' as descripcion;";
            return GetDataTable(strSQL);
        }

        // M: Masculino , F: Femenino
        public static DataTable ListarSexo()
        {
            string strSQL = "select 'M' as codigo, 'Masculino' as descripcion ";
            strSQL += " union select 'F' as codigo, 'Femenino' as descripcion;";
            return GetDataTable(strSQL);
        }
		
        // Ejemplo con procedimiento almacenado
        public static bool DeleteCliente(string strIdCliente)
        {

            bool resultado = false;

            try
            {
                using (MySqlConnection cn = new MySqlConnection(strCadenaConexion))
                {
                    cn.Open();
                    using (MySqlTransaction trx = cn.BeginTransaction())
                    {
                        try
                        {
                            using (MySqlCommand cmd = new MySqlCommand())
                            {
                                cmd.Connection = cn;
                                cmd.Transaction = trx;
                                cmd.CommandType = CommandType.StoredProcedure;
                                cmd.CommandText = "usp_Eliminar_Cliente";

                                cmd.Parameters.AddWithValue("p_idCliente", strIdCliente);

                                cmd.ExecuteNonQuery();
                            }
                            trx.Commit();
                            resultado = true;
                        }
                        catch (Exception)
                        {
                            trx.Rollback();
                            resultado = false;
                            throw;
                        }

                    }

                }
            }
            catch (Exception)
            {

                throw;
            }
            return resultado;
        }
    }
}


4. Capa de Negocio: Crud.BusinessLogic

En esta capa se debe agregar la referencia a la capa de acceso a datos Crud.DataAccess y entidades Crud.BusinessEntities

4.1 BL_Cliente.cs

Clase que contendrá las reglas de negocio de Cliente

	

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Crud.BusinessEntities;
using Crud.DataAccess;
using System.Data;

namespace Crud.BusinessLogic
{
    public class BL_Cliente
    {
        public static DataTable ListarClientes(string strCliente)
        {
            return DA_Cliente.ListarClientes(strCliente);
        }

        public static bool InsertaCliente(BE_Cliente Cliente)
        {
            return DA_Cliente.InsertaCliente(Cliente);
        }
        public static bool ActualizarCliente(BE_Cliente Cliente)
        {
            return DA_Cliente.ActualizarCliente(Cliente);
        }

        public static bool EliminarCliente(string idCliente) 
        {
            return DA_Cliente.EliminarCliente(idCliente);
        }

        public static DataTable ListarEstado()
        {
            return DA_Cliente.ListarEstado();
        }

        public static DataTable ListarSexo()
        {
            return DA_Cliente.ListarSexo();
        }
        public static string GenerarIdCliente()
        {
            return DA_Cliente.GenerarIdCliente();
        }
		
        //ejemplo con procedimiento almacenado
        public static bool DeleteCliente(string strIdCliente)
        {
            return DA_Cliente.DeleteCliente(strIdCliente);
        }
    }
}

5. Capa de Presentación: Crud.WindowsUI

En esta capa se debe agregar la referencia a la capa de negocio Crud.BusinessLogic y entidades Crud.BusinessEntities

5.1 Requisitos

Instalar desde el administrador de paquetes NuGet:




5.2 Diseño



5.3 frmCliente.cs

Clase que contendrá la lógica de interfaz de usuario

	

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MetroFramework.Forms;
using FontAwesome.Sharp;
using Crud.BusinessEntities;
using Crud.BusinessLogic;
using MetroFramework.Controls;


namespace Crud.WindowsUI
{
    public partial class frmCliente : MetroForm
    {
        private DataTable dtListado;
        private string Accion = string.Empty;

        struct ValorAccion {
            public const string NUEVO = "N";
            public const string MODIFICAR = "M";
            public const string ELIMINAR = "E";
            public const string GUARDAR = "G";
            public const string DESHACER = "D";
            public const string DEFAULT = "";

            public const string CONTROL_LIMPIAR = "1";
            public const string CONTROL_ENLAZAR_DATOS = "2";
            public const string CONTROL_DESENLAZAR_DATOS = "3";
            public const string CONTROL_HABILITAR = "4";
            public const string CONTROL_INHABILITAR = "5";
        }

        public frmCliente()
        {
            InitializeComponent();
            CargarIconos();
            this.BringToFront();
        }


        

        private void frmCliente_Load(object sender, EventArgs e)
        {
            try
            {
                CargarCombos();
                ListarCliente();
                AccionMantenimiento(ValorAccion.DEFAULT);
                FormatoGrilla();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw;
            }
            
        }

       

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            Accion = ValorAccion.NUEVO;
            AccionMantenimiento(Accion);
            txtIdCliente.ReadOnly = true;
            txtDescCliente.Focus();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            if (dtListado.Rows.Count == 0)
                return;

            Accion = ValorAccion.MODIFICAR;
            AccionMantenimiento(Accion);
            txtIdCliente.ReadOnly = true;
            txtDescCliente.Focus();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dtListado.Rows.Count == 0)
                return;

            string mensaje = "¿Está seguró de eliminar el registro?";
            if (MetroFramework.MetroMessageBox.Show(this,mensaje,"Confirmación",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    if (BL_Cliente.DeleteCliente(txtIdCliente.Text.Trim()))
                        Exito();
                }
                catch (Exception ex)
                {
                    MetroFramework.MetroMessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!bValidar())
                return;

            try
            {
                string mensaje = "¿Está seguro de guardar el registro?";

                if (MetroFramework.MetroMessageBox.Show(this, mensaje,"Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    BE_Cliente Cliente = new BE_Cliente();
                    Cliente.idCliente = txtIdCliente.Text.Trim();
                    Cliente.dsCliente = txtDescCliente.Text.Trim();
                    Cliente.dsNumDoc = txtNroDoc.Text.Trim();
                    Cliente.dsSexo = Convert.ToString(cboSexo.SelectedValue);
                    Cliente.dsDireccion = txtDireccion.Text.Trim();
                    Cliente.dsTelefono = txtTelefono.Text.Trim();
                    Cliente.dsCorreo = txtCorreo.Text.Trim();

                    Cliente.feNacimiento = dtpFechaNacimiento.Checked ? (DateTime)dtpFechaNacimiento.Value
                        : (DateTime)dtpFechaNacimiento.MinDate;
                    Cliente.dsEstado = Convert.ToString(cboEstado.SelectedValue);

                    if (Accion == ValorAccion.NUEVO)
                    {
                        Cliente.idCliente = BL_Cliente.GenerarIdCliente();
                        if (BL_Cliente.InsertaCliente(Cliente))
                        {
                            Exito();
                        }
                    }

                    if (Accion == ValorAccion.MODIFICAR)
                    {
                        if (BL_Cliente.ActualizarCliente(Cliente))
                        {
                            Exito();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw;
            }

            
        }

        private void Exito()
        {
            MetroFramework.MetroMessageBox.Show(this, "Se guardaron los datos correctamente",
                                "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
            ListarCliente();
            AccionMantenimiento(ValorAccion.DEFAULT);
            Accion = string.Empty;
        }

        private void btnDeshacer_Click(object sender, EventArgs e)
        {
            Accion = ValorAccion.DESHACER;
            AccionMantenimiento(Accion);
        }

        private void btnPrimero_Click(object sender, EventArgs e)
        {
            Primero();
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            Anterior();
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            Siguiente();
        }

        private void btnUltimo_Click(object sender, EventArgs e)
        {
            Ultimo();
        }

       private void btnBuscar_Click(object sender, EventArgs e)
        {
            ListarCliente();
            RutinaControlesDatos(ValorAccion.CONTROL_DESENLAZAR_DATOS);
            RutinaControlesDatos(ValorAccion.CONTROL_ENLAZAR_DATOS);
            RutinaControlesDatos(ValorAccion.CONTROL_INHABILITAR);
        }

        private void Primero() {
            BindingContext[dtListado, string.Empty].Position = 0;
        }
        private void Anterior()
        {
            BindingContext[dtListado, string.Empty].Position -= 1;
        }
        private void Siguiente()
        {
            BindingContext[dtListado, string.Empty].Position += 1;
        }
        private void Ultimo()
        {
            BindingContext[dtListado, string.Empty].Position = BindingContext[dtListado, string.Empty].Count-1;
        }

        private void CargarCombos()
        {
            try
            {
                cboSexo.DataSource = BL_Cliente.ListarSexo();
                cboSexo.ValueMember = "codigo";
                cboSexo.DisplayMember = "descripcion";

                cboEstado.DataSource = BL_Cliente.ListarEstado();
                cboEstado.ValueMember = "codigo";
                cboEstado.DisplayMember = "descripcion";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw;
            }


        }

        private void ListarCliente() {
            dtListado = BL_Cliente.ListarClientes(txtBuscar.Text.Trim());
            dgListado.DataSource = dtListado;
            Primero();
            if (dtListado.Rows.Count == 0)
            {
                RutinaControlesDatos(ValorAccion.CONTROL_LIMPIAR);
            }
        }

        private void AccionMantenimiento(string strAccion)
        {
            switch (strAccion)
            {
                case ValorAccion.NUEVO:
                    btnNuevo.Enabled = false;
                    btnEditar.Enabled = false;
                    btnEliminar.Enabled = false;
                    btnGuardar.Enabled = true;
                    btnDeshacer.Enabled = true;
                    btnPrimero.Enabled = false;
                    btnAnterior.Enabled = false;
                    btnSiguiente.Enabled = false;
                    btnUltimo.Enabled = false;

                    txtBuscar.ReadOnly = true;
                    txtBuscar.ResetText();
                    btnBuscar.Enabled = false;
                    dgListado.Enabled = false;

                    RutinaControlesDatos(ValorAccion.CONTROL_LIMPIAR);
                    RutinaControlesDatos(ValorAccion.CONTROL_DESENLAZAR_DATOS);
                    RutinaControlesDatos(ValorAccion.CONTROL_HABILITAR);
                    break;
                case ValorAccion.MODIFICAR:
                    btnNuevo.Enabled = false;
                    btnEditar.Enabled = false;
                    btnEliminar.Enabled = false;
                    btnGuardar.Enabled = true;
                    btnDeshacer.Enabled = true;
                    btnPrimero.Enabled = false;
                    btnAnterior.Enabled = false;
                    btnSiguiente.Enabled = false;
                    btnUltimo.Enabled = false;

                    txtBuscar.ReadOnly = true;
                    txtBuscar.ResetText();
                    btnBuscar.Enabled = false;
                    dgListado.Enabled = false;

                    RutinaControlesDatos(ValorAccion.CONTROL_DESENLAZAR_DATOS);
                    RutinaControlesDatos(ValorAccion.CONTROL_HABILITAR);
                    break;

                case ValorAccion.DESHACER:
                    btnNuevo.Enabled = true;
                    btnEditar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnGuardar.Enabled = false;
                    btnDeshacer.Enabled = false;
                    btnPrimero.Enabled = true;
                    btnAnterior.Enabled = true;
                    btnSiguiente.Enabled = true;
                    btnUltimo.Enabled = true;

                    txtBuscar.ReadOnly = false;
                    txtBuscar.ResetText();
                    btnBuscar.Enabled = true;
                    dgListado.Enabled = true;

                    RutinaControlesDatos(ValorAccion.CONTROL_ENLAZAR_DATOS);
                    RutinaControlesDatos(ValorAccion.CONTROL_INHABILITAR);
                    break;
                default:
                    btnNuevo.Enabled = true;
                    btnEditar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnGuardar.Enabled = false;
                    btnDeshacer.Enabled = false;
                    btnPrimero.Enabled = true;
                    btnAnterior.Enabled = true;
                    btnSiguiente.Enabled = true;
                    btnUltimo.Enabled = true;

                    txtBuscar.ReadOnly = false;
                    txtBuscar.ResetText();
                    btnBuscar.Enabled = true;
                    dgListado.Enabled = true;

                    RutinaControlesDatos(ValorAccion.CONTROL_DESENLAZAR_DATOS);
                    RutinaControlesDatos(ValorAccion.CONTROL_ENLAZAR_DATOS);
                    RutinaControlesDatos(ValorAccion.CONTROL_INHABILITAR);
                    break;
            }
        }

        private void RutinaControlesDatos(string strParam)
        {
            foreach (var ctl in gbDatos.Controls)
            {

                if (ctl is MetroTextBox)
                {
                    var txt = (MetroTextBox)ctl;
                    switch (strParam)
                    {
                        case ValorAccion.CONTROL_LIMPIAR:
                            txt.ResetText();
                            break;
                        case ValorAccion.CONTROL_ENLAZAR_DATOS:
                            if (txt.Tag != null)
                            {
                                txt.DataBindings.Add(new Binding("Text", dtListado, txt.Tag.ToString()));
                            }
                            break;
                        case ValorAccion.CONTROL_DESENLAZAR_DATOS:
                            txt.DataBindings.Clear();
                            break;
                        case ValorAccion.CONTROL_HABILITAR:
                            txt.ReadOnly = false;
                            break;
                        case ValorAccion.CONTROL_INHABILITAR:
                            txt.ReadOnly = true;
                            break;
                        default:
                            break;
                    }
                }
                if (ctl is MetroComboBox)
                {
                    var cbo = (MetroComboBox)ctl;
                    switch (strParam)
                    {
                        case ValorAccion.CONTROL_LIMPIAR:
                            cbo.SelectedIndex = -1;
                            break;
                        case ValorAccion.CONTROL_ENLAZAR_DATOS:
                            if (cbo.Tag != null)
                            {
                                cbo.DataBindings.Add(new Binding("SelectedValue", dtListado, cbo.Tag.ToString()));
                            }
                            break;
                        case ValorAccion.CONTROL_DESENLAZAR_DATOS:
                            cbo.DataBindings.Clear();
                            break;
                        case ValorAccion.CONTROL_HABILITAR:
                            cbo.Enabled = true;
                            break;
                        case ValorAccion.CONTROL_INHABILITAR:
                            cbo.Enabled = false;
                            break;
                        default:
                            break;
                    }
                }
                if (ctl is MetroDateTime)
                {
                    var dtp = (MetroDateTime)ctl;
                    switch (strParam)
                    {
                        case ValorAccion.CONTROL_LIMPIAR:
                            dtp.Text = string.Empty;
                            break;
                        case ValorAccion.CONTROL_ENLAZAR_DATOS:
                            if (dtp.Tag != null)
                            {
                                dtp.DataBindings.Add(new Binding("Text", dtListado, dtp.Tag.ToString()));
                            }
                            break;
                        case ValorAccion.CONTROL_DESENLAZAR_DATOS:
                            dtp.DataBindings.Clear();
                            break;
                        case ValorAccion.CONTROL_HABILITAR:
                            dtp.Enabled = true;
                            break;
                        case ValorAccion.CONTROL_INHABILITAR:
                            dtp.Enabled = false;
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        private void CargarIconos()
        {
            var imgForm = IconChar.UserAlt.ToBitmap(IconFont.Auto, 32, Color.Silver);
            this.Icon = System.Drawing.Icon.FromHandle(imgForm.GetHicon());

            var imgCliente = IconChar.User.ToBitmap(IconFont.Auto, 16, Color.DarkGray);
            var imgDocumento = IconChar.AddressCard.ToBitmap(IconFont.Auto, 16, Color.DarkGray);
            var imgDireccion = IconChar.MapMarkedAlt.ToBitmap(IconFont.Auto, 16, Color.DarkGray);
            var imgTelefono = IconChar.Phone.ToBitmap(IconFont.Auto, 16, Color.DarkGray);
            var imgCorreo = IconChar.Envelope.ToBitmap(IconFont.Auto, 16, Color.DarkGray);

            txtDescCliente.Icon = imgCliente;
            txtNroDoc.Icon = imgDocumento;
            txtDireccion.Icon = imgDireccion;
            txtTelefono.Icon = imgTelefono;
            txtCorreo.Icon = imgCorreo;

        }

        private void FormatoGrilla()
        {
            foreach (DataGridViewColumn col in dgListado.Columns)
            {
                col.Visible = false;
                col.SortMode = DataGridViewColumnSortMode.NotSortable;

            }

            dgListado.Columns["idCliente"].Visible = true;
            dgListado.Columns["idCliente"].HeaderText = "ID";

            dgListado.Columns["dsCliente"].Visible = true;
            dgListado.Columns["dsCliente"].HeaderText = "Cliente";

            dgListado.Columns["dsEstado"].Visible = true;
            dgListado.Columns["dsEstado"].HeaderText = "Estado";
        }

        private bool bValidar()
        {
            if (string.IsNullOrEmpty(txtDescCliente.Text.Trim()))
            {
                MetroFramework.MetroMessageBox.Show(this,"Ingrese descripción de cliente","Error",
                    MessageBoxButtons.OK,MessageBoxIcon.Error);
                txtDescCliente.Focus();
                return false;
            }

            if (cboEstado.SelectedIndex == -1)
            {
                MetroFramework.MetroMessageBox.Show(this, "Seleccione estado", "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboEstado.Focus();
                return false;
            }

            return true;
        
        }

    }
}


Video completo del tutorial en mi canal

Copyright © 2021 TRUJILLOSOFT