domingo, 29 de septiembre de 2013

contextMenuStrip y DataGridView

Hola a todos:
Aquí mostrare como usar un control contextMenuStrip para:
  1. Copiar el valor de una celda de un control DataGridView al ClipBoard
  2. Copiar el contenido de una Fila de un control DataGridView al ClipBoard
  3. Eliminar un Row del control DataGridView:
Para lograr esto:
1. Cree un proyecto de tipo WindowsForms
2. Agregue un control DataGridView y agregue tres columnas
addColumn
3. Establezca FullRowSelect a la propiedad SelectionMode del control DataGridView.
4. Agregue un control contextMenuStrip y agréguele tres items nuevos con el nombre: copyCellValue, copyRowValue y deleteRow

contextMenuStrip
Bien, ahora sobre el Formulario Form1 haga doble click sobre la barra de titulo, esto generar el evento Load del formulario, una vez echo esto copie y pegue estas líneas para cargar datos al control DataGridView:
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Rows.Add("Fila uno columna uno", "Fila uno columna dos", "Fila uno columna tres");
dataGridView1.Rows.Add("Fila dos columna uno", "Fila dos columna dos", "Fila dos columna tres");
dataGridView1.Rows.Add("Fila tres columna uno", "Fila tres columna dos", "Fila tres columna tres");
dataGridView1.Rows.Add("Fila cuatro columna uno", "Fila cuatro columna dos", "Fila cuatro columna tres");
}

Ahora, genere el evento CellMouseClick del control DataGridView y pegue el código siguiente (solo lo que este dentro del evento):
//Variable que contendrá el valor de la celda donde se realice el click derecho con el Mouse
private string _cellValue = String.Empty;
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//Preguntamos si el boton pulsado del Mouse es el Derecho
//si no lo es no salimos sin hacer nada mas
if (e.Button != MouseButtons.Right) return;

if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;

//enviamos el valor de la celda a la variable _cellValue
_cellValue = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();

//Definimos el lugar donde aparecera el scontextMenuStrip
contextMenuStrip1.Show(MousePosition);
}

Después de echo lo anterior, genere el evento ItemClicked del control contextMenuStrip, dentro pegue las siguientes líneas (solo lo que este dentro de evento):

private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//Preguntamos por el nombre del item pulsado
switch (e.ClickedItem.Name)
{
case "copyCellValue":
//
//Copiamos el valor de la variable _cellValue al ClipBoard
//
Clipboard.SetText(_cellValue);
break;

case "copyRowValue":
//
//Copiamos el valor de toda la Fila selccionada al ClipBoard
//
DataObject dataObj = dataGridView1.GetClipboardContent();
if (dataObj != null)
Clipboard.SetDataObject(dataObj);
break;

case "deleteRow":
//
//Identificamos la Fila actualmente seleccionada
//
DataGridViewRow row = dataGridView1.CurrentRow;
//
//Preguntamos si el valor de Row es diferente de null, esto para evitar posibles
//excepciones de referencias Nulas
//
if (row != null) dataGridView1.Rows.Remove(row);

break;
}

Ahora genere el proyecto y ejecútelo presionando la tecla de función F5 deberá de tener un formulario como el siguiente:

run
Lamentablemente no puedo subir una imagen con el Menú Contextual desplegado porque al pulsar las teclas de Windows este desaparece, pero si hizo todo bien el Menú estará funcionando de maravilla.

Saludos desde Monterrey, Nuevo León México!

Ejemplo C#
Ejemplo Vb.Net

Nota: El proyecto fue desarrollado en Vs2010 el Framework 4.0

8 comentarios:

  1. Al grano sin tanto royo Practico y Funcionando

    ResponderEliminar
    Respuestas
    1. Hola:

      Me alegra que el articulo te haya sido de utilidad. Recuerda dar click en alguno de nuestros anuncios si lo que se ofrecen en ellos te interesa.

      Eliminar
  2. Podrías decirme en sí, el concepto o para que sirve ContextMenuStrip?

    ResponderEliminar
  3. El link esta caido... por fa el codigo en vb.net gracias

    ResponderEliminar
  4. sabes por que no puedo ocupar ItemClicked, el entorno me muestra un mensaje System.Windows.forms.DataGriview no contiene una deficion del evento ItemClicked ni se encontro un ningun metodo de extencion ItemClicked

    ResponderEliminar

Deja un comentario si el articulo fue de utilidad.