Estimados Amigos,

Hoy vamos a adentrarnos en el mundo de los Menúes Contextuales, esos que aparecen cuando clickeamos con el botón derecho del Mouse sobre un control.

El procedimiento general es sencillo, pero debemos aprender algunos aspectos con respecto al código.

En primer lugar, crearemos un ejemplo en un formulario sencillo, donde volcaremos un TextBox, un Label y un Botón.

ContextMenuStrip1.jpg

Vamos a arrastrar un Control ContextMenuStrip al formulario

ContextMenuStrip2.jpg

Se nos ubicará en el área de Componentes del Formulario

ContextMenuStrip3.jpg

Adicionaremos 2 items al menú contextual (esto se logra haciendo click en el control, abriendose automáticamente el Editor de Menú)

ContextMenuStrip4.jpg

Nota : Si bien durante la Edición de Menú se muestra en la parte superior del formulario, el mismo desaparecerá al hacer click en cualquier parte del formulario
Ahora setearemos en nuestro TEXTBOX la propiedad

ContextMenuStrip5.jpg

Hasta aquí todo sencillo, pero debemos superar una incógnita que se produce cuando tenemos que saber desde que control se ha llamado al menú contextual, teniendo en cuenta que generalmente tenemos muchos TEXTBOX u otros controles y para casi todos aplicaremos el mismo Menú.

Vamos a la parte mas compleja, que es el código, y en este caso, analizaremos el evento que se producirá solo en la primera opción del menú... la de COPIAR.

Código:
    Private Sub OpcionCopiar_Click(sender As Object, e As EventArgs) Handles OpcionCopiar.Click
       
          Dim ItemMenu As ToolStripItem = sender
          Dim Owner As ContextMenuStrip
          Dim Objeto As Control
          Dim TextB As TextBox

          If ItemMenu Is Nothing = False Then
                Owner = ItemMenu.Owner
                If Owner Is Nothing = False Then
                       Objeto = Owner.SourceControl
                       If TypeOf Objeto Is TextBox Then
                                TextB = Objeto
                                TextB.SelectAll()
                                TextB.Copy()
                        End If
                 End If
           End If
    End Sub
Explicaremos paso a paso este código..

Primero decir que el evento Click en el objeto OpcionCopiar (un nombre que hemos puesto nosotros al item de menú Copiar)

El problema si queremos obtener el control origen de un Item de Menú.. es que en lugar de devolvernos el TEXTBOX que lo originó, nos devuelve el Menu.

Es decir, que tenemos una estructura que parte de un MENU como entidad, y luego por debajo estan los ITEMS DEL MENU.. para saber el SOURCE de un Item de Menu tenemos que llegar primero al MENU Padre.

Por eso hemos definido 4 objetos....
  • ItemMenu que es del tipo ToolStripItem y al cual iniciaremos con el Sender, es decir con el Item de Menu que fue seleccionado.. en este caso.. el item "Copiar"
  • Owner que es del tipo ContextMenuStrip
  • Objeto lo hemos definido del tipo Object generico (porque no sabemos si el objeto disparador del Menu es un TextBox, o un ListBox o cualquier otro)
  • TextB de tipo TextBox para poder procesar este ejemplo en particular
La idea es ir de mayor a menor hasta resolver QUE TEXTBOX HA DISPARADO EL MENU y EJECUTAR EL CODIGO CORRESPONDIENTE
  1. Preguntamos si ItemdeMenu fue inicializado (para evitar que se haya hecho click fuera de los elementos del menú)
  2. Inicializamos Owner capturando el nombre del Menu Principal, en este caso.. (MenuContextual1)
  3. Preguntamos si Owner fue inicializado correctamente o fue Nulo.
  4. Inicializamos Objeto con la Propiedad SourceControl de Owner (recuerden que el SourceControl del Item de Menú.. es el menú padre, por eso debemos preguntar por el SourceControl del Menú Padre para llegar al Objeto que disparó el menú)
  5. Con "If TypeOf Objeto is TextBox" le estamos preguntando, si el Objeto que disparó al Menú es un TextBox, y por consecuencia.. el Comando COPIAR se desarrollará de una forma específica.
  6. Al ser un TextBox, pasamos el control Padre a nuestro Objeto TextBox llamado TextB
  7. Por último, las 2 instrucciones que representan nuestro Item COPIAR, un TextB.SelectAll() para que seleccione todo el texto del TEXTBOX y por último el comando TextB.Copy() que terminará tomando el texto seleccionado anteriormente y lo copia al portapapeles.
El mismo procedimiento debería aplicarse a la opción PEGAR, solo cambiando las ultimas 2 instrucciones.

Espero que sea de utilidad de todos, y no olviden de compartir las notas que les gusten, ayudando a difundir nuestra obra.

Muchas Gracias

Saludos Cordiales


Pablo G. Tilotta
VB-MUNDO Co.