Publicado en Entity Framework, Programacion, Tecnologia, Visual Studio

C# Datagridview: Menu contextual con el boton derecho

Otro mini tutorial para crear un menu contextual en un dataGridView, como despliega la imagen principal.

Primero crearemos un proyecto windows form en nuestro Visual studio

En este ejemplo usaremos una base de datos con una tabla simple que simula un maestro de productos:

CREATE TABLE Productos
( 
	producto_id          integer IDENTITY ( 1,1 ) ,
	nombre               varchar(256)  NULL ,
	precio               integer  NULL ,
	fecha_ingreso        datetime  NULL ,
	habilitado           bit  NULL 
)
go

ALTER TABLE Productos
	ADD CONSTRAINT XPKProductos PRIMARY KEY  CLUSTERED (producto_id ASC)
go

La version del Sql Server sera la 2017 developer

Con la base y tabla listas, agregaremos el modelo Entity Framework para las consultas y actualizaciones:

1) Creamos una carpeta para el Modelo

2) Seleccionamos el ADO.NET Entity Data Model

3) Hacemos la conexion con la base de datos

4) Marcamos que usaremos la conexion el app.config

5) Marcamos la version del Entity Framework

6) Seleccionamos la tabla de Productos que vamos a usar

7) Finalmente el modelo queda en nuestra solución

Ahora crearemos la grilla para llenarla con los datos de la tabla:

8) Agregamos el dataGrigView al formulario

9) Aca esta la conexion a la base de datos a usar en el codigo

10) El codigo para llenar la grilla con la consulta a la tabla

11) El despliegue de los datos

El codigo c# para consultar los registros al NET Entity Framework con “method syntax”

void CargarGrilla()
        {
            var db = new TestDGWEntities();

            var lista = db.Productos.ToList();

            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.DataSource = lista;

        }


        private void Form1_Load(object sender, EventArgs e)
        {
            CargarGrilla();   
        }

17) Ahora agregamos el codigo a la grilla para crear nuestro menu contextual, creado en el evento MouseClick:

18) Codigo del evento MouseClick


private void Habilitar(Object sender, EventArgs e)
        {
            MessageBox.Show("OK");
        }

        private void Deshabilitar(Object sender, EventArgs e)
        {
            MessageBox.Show("NOK");
        }
		
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //seleciona la fila del click derecho
                var hti = dataGridView1.HitTest(e.X, e.Y);
                dataGridView1.ClearSelection();
                dataGridView1.Rows[hti.RowIndex].Selected = true;

                //creo menu conextual con dos items
                ContextMenu cm = new ContextMenu();
                MenuItem mi = new MenuItem();
                mi.Text = "Habilitar";
                mi.Click += Habilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                mi = new MenuItem();
                mi.Text = "Deshabilitar";
                mi.Click += Deshabilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                cm.Show(dataGridView1, new Point(e.X, e.Y));                

            }
        }

Ahora crearemos el codigo para habilitar y deshabilitar un producto con el menu contextual:


string registroSeleccionado;

        //variable para guardar el ID del producto a deshabilitar
        string RegistroSeleccionado
        {
            get { return registroSeleccionado; }
            set { registroSeleccionado = value; }
        }
		
		
void Actualizar(int id, bool habilitar)
        {
            try
            {
                var db = new TestDGWEntities();

                var productoDB = db.Productos.FirstOrDefault(p => p.producto_id == id);

                if (productoDB == null)
                {
                    //si no existe no hacemos nada (para otros ejemplos, aqui se hace el insert)
                }
                else
                {
                    //aca hacemos el UPDATE del estado

                    productoDB.habilitado = habilitar;

                    db.SaveChanges();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Habilitar(Object sender, EventArgs e)
        {
            Actualizar(int.Parse(RegistroSeleccionado), true);
            CargarGrilla();
        }

        private void Deshabilitar(Object sender, EventArgs e)
        {
            Actualizar(int.Parse(RegistroSeleccionado), false);
            CargarGrilla();
        }

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //seleciona la fila del click derecho
                var hti = dataGridView1.HitTest(e.X, e.Y);
                dataGridView1.ClearSelection();
                dataGridView1.Rows[hti.RowIndex].Selected = true;

                RegistroSeleccionado = dataGridView1.Rows[hti.RowIndex].Cells[0].Value.ToString();

                //creo menu conextual con dos items
                ContextMenu cm = new ContextMenu();
                MenuItem mi = new MenuItem();
                mi.Text = "Habilitar";
                mi.Click += Habilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                mi = new MenuItem();
                mi.Text = "Deshabilitar";
                mi.Click += Deshabilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                cm.Show(dataGridView1, new Point(e.X, e.Y));                

            }
        }		

18) Al registro con ID 5 le damos click derecho y los deshabilitamos

19) Al recargar la grilla, se ve que el estado cambio a False

20) Repetimos con el registro ID 10

21) vemos que el producto 5 y 10 estan deshabilitados

22) El codigo completo del formulario


using DataGridWiew.Modelo;
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;

namespace DataGridWiew
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string registroSeleccionado;

        //variable para guardar el ID del producto a deshabilitar
        string RegistroSeleccionado
        {
            get { return registroSeleccionado; }
            set { registroSeleccionado = value; }
        }


        void CargarGrilla()
        {
            var db = new TestDGWEntities();

            var lista = db.Productos.ToList();

            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.DataSource = lista;

        }

        void Actualizar(int id, bool habilitar)
        {
            try
            {
                var db = new TestDGWEntities();

                var productoDB = db.Productos.FirstOrDefault(p => p.producto_id == id);

                if (productoDB == null)
                {
                    //si no existe no hacemos nada (para otros ejemplos, aqui se hace el insert)
                }
                else
                {
                    //aca hacemos el UPDATE del estado

                    productoDB.habilitado = habilitar;

                    db.SaveChanges();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void Habilitar(Object sender, EventArgs e)
        {
            Actualizar(int.Parse(RegistroSeleccionado), true);
            CargarGrilla();
        }

        private void Deshabilitar(Object sender, EventArgs e)
        {
            Actualizar(int.Parse(RegistroSeleccionado), false);
            CargarGrilla();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CargarGrilla();   
        }



        private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                //seleciona la fila del click derecho
                var hti = dataGridView1.HitTest(e.X, e.Y);
                dataGridView1.ClearSelection();
                dataGridView1.Rows[hti.RowIndex].Selected = true;

                RegistroSeleccionado = dataGridView1.Rows[hti.RowIndex].Cells[0].Value.ToString();

                //creo menu conextual con dos items
                ContextMenu cm = new ContextMenu();
                MenuItem mi = new MenuItem();
                mi.Text = "Habilitar";
                mi.Click += Habilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                mi = new MenuItem();
                mi.Text = "Deshabilitar";
                mi.Click += Deshabilitar; //metodo al dar click
                cm.MenuItems.Add(mi);

                cm.Show(dataGridView1, new Point(e.X, e.Y));                

            }
        }

       
    }
}

Y con esto terminamos el tutorial del menu contextual con el boton derecho.

TYDW.-

Un comentario sobre “C# Datagridview: Menu contextual con el boton derecho

  1. Muy interesante el Post, la verdad he trabajado con DataGridView y no sabia como generar un menú contextual, de verdad lo voy a usar, gracias por tu ayuda.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s