Ir al contenido principal

TextEditor

TextEditor
Este control nace a raíz de una pregunta en el foro de Visual Basic .Net, sobre como cambiar el borde de un TextBox a un borde personalizado y además andaba buscando cambiar la apariencia del control NetBarControl para poder aplicarle una nueva propiedad para cambiar el estilo.
ejemplo:
NetBarControlX

Aun que esta imagen solo es un pre-formato de cómo funcionara el control NetBarControl, solo que me distraje creando este nuevo control TextEditor. Así que le echaré mano al terminado este nuevo control.








Bien, la idea inicial era solo agregar botones a un control TextBox, pero luego usando el Mozilla, al descargar unos archivos me percate de un control en la parte inferior de esta venta de descargar, aun que se suele ver mucho en las páginas Web, pero me llamo la atención aquí en el Mozilla y en el Window Live Messenger.
clip_image005
clip_image007
Entonces… me entro el gusano de la curiosidad, agregar la imagen luego de agregar los botones ya no era la parte difícil, la parte curiosa es mostrar el Texto como marca de agua, encontré varios ejemplos en la Red (Internet) pero…. No llenaron mis expectativas ya que estos usan el Paint del Control, funcional, pero!!!!... tiene un cierto parpadeo, cosa que no me gusto, pero esta buena la idea…
Luego… viendo las preguntas del foro, la típica pregunta… un TextBox que solo acepte números… bien, ya había descargado un control de CodeProject que tiene esta funcionalidad, para usarlo en mis desarrollos, pero cuando decidí usarlo, en mi ordenador funciona bien pero ya en el ordenador del cliente me genera una excepción y me vota el sistema “no con esto digo que el control no funcione, funciona pero no tenia tiempo para averiguar cual es el problema ya que mi sistema operativo es Windows Vista y el del cliente es Windows XP, no deberia ser problema, pero me fallo ya en la cancha”, así que revisándolo para ver cómo aplicar esta funcionalidad en mi control, me dije… bueno, voy a escribirlo de cero y voy hacer que trabaje con la configuración regional del Window’s y en lugar de crear varios controles, usar uno solo, así que de aquí nació la idea de agregarla una propiedad más al control la cual es “MaskType” la cual por el momento está limitada a los siguientes tipos: None, Currency, Numeric, Percent e Integer y viendo cómo funcionan otros controles de terceros, veremos si lo volvemos más flexible la parte de el formato a utilizar ya que interna mente usa el formato para cada caso: Currency “C”, Numeric “N”, Percent “P”.
Ahora, hasta donde lo he probado creo que está listo, así que prepare este proyecto de ejemplo para que lo puedan probar y si es de vuestro agrado usarlo en vuestro desarrollo y no está de más que hagan sus comentarios al respecto sobre que mejorar, que agregar o que quitar….

Imagen de ejemplo:
TextEditorDemo
Propiedades
AutoHeight Permite cambia el alto del control, valor predeterminado true
Buttons
Permite agregar y remover los botones que serán mostrados dentro del control TextEditor, tipo de propiedad TextEditorButtonCollection.
EditValue
Propiedad que almacenara el valor sin formato que se mostrara en la propiedad Text ya formateado en los casos de usar MarkType en Currency, Numeric, Percent e Integer.
EnterMoveNextControl
Permite indicar si el foco del control se moverá al siguiente control según el TAB orden al presionar la tecla ENTER, valor predeterminado true.
Image
Permite insertar una imagen que será mostrada dentro del control TextEditor.
ImageAlignment
Indica la posición donde se mostrara la Imagen dentro del Control, valor predeterminado Right
MaskType
Permite indicar el modo de entrada de datos que permitirá el control, valor predeterminado MaskType.None
WaterMarkFont
Permite indicar el tipo de letra que se usara para mostrar el texto como marca de agua.
WaterMarkForecolor Permite indicar el color del texto que se mostrara como marca de agua.
WaterMarkText
Permite indicar el texto que se mostrara como marca de agua.
Enum MaskType
None
Permite una entrada de datos sin restricciones
Currency
Permite una entrada de datos de solo números con un formato de moneda usando el signo de moneda definido en la configuración regional del sistema operativo.
Numeric
Permite una entrada de datos de solo números con un formato de número definido en la configuración regional del sistema operativo.
Percent
Permite una entrada de datos de solo números con un formato de porcentaje definido en la configuración regional del sistema operativo.
Integer
Permite una entrada de datos de solo números sin formato, sin separador de miles y separador de decimales.
Eventos
ButtonClick
Se ejecuta al presionar y soltar el mouse sobre cualquiera de los botones del control TextEditor, recibiendo un argumento del tipo ButtonPressedEventArgs que contiene data relacionada al evento.
Button Provee información relacionada con el botón presionado.
EditValueChanged Se ejecuta al cambiar el valor de la propiedad EditValue.

TextEditorButton

Representa un botón dentro del control TextEditor.
Propiedades
Enabled
Indica si el botones está disponible para interactuar con el usuario, valor predeterminado true
Image
Permite agregar una imagen que será mostrada dentro del botón
IsLeft
Permite indicar si el botón debe mostrarse al lado izquierdo del Control, valor predeterminado false
Tag
Permite agregar información adicional al botón, valor predeterminado null (Nothing en Visual Basic)
Text
Permite agregar un texto que será mostrado dentro del botón
Visible
Permite indicar si el botón esta visible al usuario, valor predeterminado true
Width
Permite indicar el ancho del botón, valor predeterminado -1

Artículos Relacionados:

TextBox con borde personalizado
TextBox con Icon/Imagen
DataGridViewTextEditorColumn

Comentarios

  1. son muy interesantes los ejemplos k pones pero genera un error de dividir entre 0 si borro el costo por lo demas funciona bien pero m gustaria preguntarte lo siguiente es posible usar estos controles en otros proyectos como por ejeemplo uno que este en el visual studio.net y k este en el lenguaje .net y no en el c# m gustaria k m respondas esa inkietud de antemano gracias

    ResponderEliminar
  2. Hola Michael,

    probe el demo y es cierto genera un error al borrar el costo, pero recuerda que es un demo así que no le aplica las validaciones necesarias ya que es para mostrar el funcionamiento del control en si.

    se pueden usar ademas en VBasic.Net, generalmente no coloco un demo en este lenguaje pero lo tomare en cuenta ya que no eres el primero que me pregunta y tienes razon a simple vista cualquier diria "Solo funciona en C#" pero no, tambien funcionan en VB.

    ah!!!!... estan hechos con Framework 3.5 SP1, asi que tendras que asegurarte que la maquina donde implementes tu aplicación tenga el Net Framework 3.5 SP1.

    lo menciono porque me paso cuando instale una aplicación a un cliente usando estos controles (Porque seria el colmo hacerlos y no usarlos) y me genero error y me fije que no tienia el SP1 del Framework 3.5.

    Gracias por tu comentario.

    Salu2,

    ResponderEliminar
    Respuestas
    1. Marvin, la demo no se encuentra en linea para descargar
      Te mando un abrazo
      Gonzalo
      gmaniero@palmaresopen.com.ar

      Eliminar
  3. Disculpa mi ignorancia pero como lo implemento en mi aplicación, en la carpeta debug se crea la librería TextEditor.dll esa la importo a mi proyecto o solo utilizo el código Tuyo? de antemano gracias!!!

    ResponderEliminar
  4. Toma la Dll que esta en el directorio debug y copiala a cualquier otro directorio donde se te haga mas facil localizarla, luego en tu projecto agregas la referencia buscando la dll en este nuevo directorio.

    yo estoy creando un instalador para que sea mas facil agregarla al ToolBox del Visual Studio, lo estare publicando entre hoy y mañana.

    Salu2,

    ResponderEliminar
  5. ps puedes intentar implementar con una propiedad de que texto se mostrara cuando la caja de texto <> cuando reciva el foco la caja de texto sencillamente queda en blanco, solo es cuestion de simular el efecto jugar con colores ...

    ResponderEliminar
  6. Hola Marvin, a ver si me puedes echar una mano

    Al instalar los controles, sólo aparece el grupo MP.09.1: Common Controls, pero lo controles no aparecen y al intentar agregarlos manualmente y pasarlo al form para usarlos me sale este error:
    El Universe de tupos no puede resolver el ensamblado: System.Design, version=2.0.0.0, Culture=neutral, PublicKeyToken=b0....

    ResponderEliminar
    Respuestas
    1. Cuando creas un nuevo projecto en VS2010 este utiliza el "Target framework" = ".NET Framework 4 Client Profile" deberas de cambiarlos a ".NET Framework 4" esto en las propiedades del projecto en la solapa de Aplicación.

      Salu2,

      Eliminar
  7. Hola otra vez.

    Ya he instalado y usado el control TextEditor, pero no hay forma de que se lance el evento al pulsar el botón de dentro del control. ¿sabes si tengo que configurar algo mas del entorno?

    ResponderEliminar
  8. el control tiene un metodo llamado ButtonClick que se dispara o desencadena cuando pulsas cualquiera de los botones del control, este metodo recibe dos parametros en control que lo desencadena y un eventArgs llamado TextEditor.ButtonPressEventArgs este parametro tiene una propiedad llamada Button que contiene la información del boton precionado.

    Salu2,

    ResponderEliminar
    Respuestas
    1. Gracias Marvin, a lo que me refiero, es que, el evento no se dispara al pulsar sobre el botón. Te copio para que veas como lo he definido

      private void textEditor1_ButtonClick(object sender, TextEditor.ButtonPressedEventArgs e)
      {
      MessageBox.Show("Presionado boton", "TextEditorButton");
      }

      Eliminar
    2. esta raro... acabo de descargar el control de ejemplo y me ha funcionado sin problema alguno... lo que podrias hacer es crearte un projecto nuevo con un unico formulario, agregar el control, programa el evento "ButtonClick" y me lo haces llegar para poder revisarlo.

      lo puedes subir a SkyDriver para que yo lo pueda descargar.

      Salu2,

      Eliminar
    3. Gracias Marvin

      Lo que pasaba es que el evento no esta enlazado automáticamente, como en otros controles, al método en cuestión. Lo he enlazado en la ventana de propiedades -> eventos y ha funcionado.

      Eliminar
  9. Hola Marvin

    ¿Cómo identifico el Item pulsado del control NetBarControl?

    ResponderEliminar
    Respuestas
    1. si te fijas... los Items tienen un unico metodo llamado "ItemClick" este recibe dos parametros:

      private void itemPrueba_ItemClick(object sender, EventArgs e)
      {

      }

      si estas enlazando varios Items a un mismo evento "ItemClick" te puedes giar por el parametro "object sender" y castearlo a NetBarItem, ejemplo:

      private void itemPrueba_ItemClick(object sender, EventArgs e)
      {
      NetBarControl.NetBarItem itemClick = sender as NetBarControl.NetBarItem;
      MessageBox.Show(string.Format("Item Click: {0}", itemClick.Text));
      }

      Salu2,

      Eliminar
    2. Gracias Marvin

      Una cuestión: Por lo que he visto en tu blog no tengo la última versión del control.
      Cómo hago para actualizar mi proyecto, completo, con la nueva dll del control sin tener que empezar de nuevo.

      Eliminar
    3. Los puedes actualizar simplemente reemplazando la DLL que ya tienes por la nueva DLL en el directorio donde los descargastes, luego el projecto solo lo tienes que recompilar y listo.

      Salu2,

      Eliminar
  10. Quisiera que hicieras un tutorial donde explicas como hacer ese control u otro simple... aun no entiendo como le haces para poder hacer que las propiedades de tus controles se puedan cambar en el diseñador en vez de en el codigo... gracias...

    ResponderEliminar
    Respuestas
    1. Esto lo puedes encontrar en este otro articulo: http://marvinpinedablog.blogspot.com/2011/10/como-crear-un-control-personalizado-en.html, si te fijas se usan las clases ControlDesigner o ParentControlDesigner y DesignerActionList, busca informacion sobre estas clases en MSDN.

      Salu2,

      Eliminar
  11. Marvin, muy buen control... solo es que necesito el texteditor con multilinea ¿Es posible?

    Si es así ... ¿Cómo lo hago?

    Gracias!

    ResponderEliminar
  12. Hola Marvin:
    Unas de las cosas que admiro de ti es la capacidad para crear tus propios controles, como es en este caso, el control es muy agradable a simple vista, una pregunta, es posible establecer una imagen diferente al momento de que pasar el mouse sobre el control? o usar un color al establecer el foco y restablecer el mismo al retirar el cursor del control?

    Bueno esto parece mas pedir y pedir, :D aunque esto son solo dudas. Gracias por todo tu esfuerzo dedicación y sobre todo la amabilidad de compartirlo con los demás.

    Saludos
    Luis Escobar

    ResponderEliminar
    Respuestas
    1. Hola Luis, gracias por tu comentario.... sobre la imagen, si te refieres a la imagen que puedes alinear a la izquierda o a la derecha, lo podrías hacer aplicando los evento MouseMove y MouseLeave y sobre los bordes fíjate que precisamente le estoy implementando esta lógica al control solo déjame terminar de hacer los últimos ajustes para publicarlo.

      Salu2

      Eliminar
  13. Mucha Gracias por responder Marvin, seguimos al pendiente para ver tus nuevos controles.

    Un abrazo y admiración por tu trabajo!

    Luis Escobar

    ResponderEliminar
  14. Hola Marvin lo primero es para felicitarte ya que has creado un control excelente y que nos resolvería un millón de problemas al desarrollar nuestras aplicaciones.

    Me quedan dos dudas.

    1. Al definir la propiedad MaskType en Integer para que me acepte solo números me da un error de OverflowExeption ya que estoy tratando de introducir un numero de 15 dígitos ("Valor demasiado grande o demasiado pequeño para Int32"), intente con Numeric pero me quedan al final del número un .00 y ya que es un numero de serie no lo puedo dejar con ese .00 espero haberme explicado :)

    2. Cual es el tipo de licencia para este control?? podemos implementarlo en nuestras aplicaciones??

    quedo a la espera de tu respuesta y agradeciéndote por tu trabajo y gran esfuerzo

    Saludos desde Panamá

    ResponderEliminar
    Respuestas
    1. Hola Shaymon,

      el Integer tiene un máximo de 10 dígitos, si se pasa seria un long, Mayor referencia: http://msdn.microsoft.com/en-us/library/5kzh1b5w(v=vs.80).aspx

      y en cuanto a la licencia.... lo puedes usar libremente.

      Salu2,

      Eliminar
  15. Hola Marvin:
    Probando tu control en aplicaciones de test, me tope con un inconveniente con respecto al evento KeyDown del mismo, ya que no entra a ejecutar las lineas de código presionando al tecla "ENTER" o "INTRO". El bloque de código que estoy tratando de ejecutar es el siguiente:


    Private Sub txtpornombre_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles txtpornombre.KeyDown
    Select Case e.KeyData
    Case Keys.Enter
    CountEnter = CountEnter + 1
    If CountEnter = 2 Then
    Me.Close()
    End If
    End Select
    End Sub

    Pero como te menciono, no entra cuando presiono una de esas dos teclas, no siendo hace para las demás.

    Gracias!

    Luis Escobar

    ResponderEliminar
    Respuestas
    1. Despues de no parar el las pruebas, me di cuenta que el origen del problema esta en la configuracion de la propíedad EnterMoveNextControl que estaba establecido en true, cambiando la configuracion a false, pude usar las teclas Enter e Intro sin ningun problema...

      Saludos!
      Luis Escobar

      Eliminar
  16. Hola Marvin, Excelente tu control TextEditor
    lo estoy utilizando en mi aplicacion, pero cuando la publique e instalé en otra maquina con windows 8, me presenta un error. Parece que no encuentra la libreria .dll
    como la instalo?

    ResponderEliminar
    Respuestas
    1. mmmm... que dice exactamente el error?, yo distribui una aplicación que se que se instalo en una computadora que tiene Windows 8 64bits y no tubieron problemas... abria que ver el error que mencionas.

      Salu2,

      Eliminar
  17. Hola Marvin, muy bueno el control textEditor.

    Solo una pregunta, ¿es posible descargar el código para estudiarlo?

    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola Javier, no se si has visto un nuevo articulo que publique sobre "TextBox con Borde Personalizado", estoy preparando la continuación de este "TextBox con Icono/Imagen", donde se incluye el fuente, pero tambien puedes ver en este Link: http://www.vbaccelerator.com/home/NET/Code/Controls/ListBox_and_ComboBox/TextBox_Icon/article.asp..... en el articulo que yo publicare lo hago de otra manera, pero puedes ir leyendo este.

      Salu2,

      Eliminar
  18. Hola buenas tardes Marvin, he estado implementando tu control en algunos de mis proyectos, pero me han salido algunos errores repentinamente que me han dejado boquiabierto pues no encuentro una bendita solución :S...

    Espero puedas ayudarme a la brevedad posible.
    Una vez que me lanzó el primer error me mandó a una línea de tu ensamblado, y me dice que es un error de referencia circular.

    public abstract class TextBox : TextBox

    Le agregué el System.Windows.Forms para que me quedara de la siguiente forma,
    public abstract class TextBox : System.Windows.Forms.TextBox

    Pero luego me salieron errores en una clase que tiene el nombre de public class TextEditorButtonCollection : CollectionBase

    Luego de intentar corregir me aparecen más y más errores D:...
    Eliminé la referencia de la dll de mi proyecto y la volví a agregar, pero mis esfuerzos parecen inútiles, me vuelve a marcar lo mismo cada vez.

    ¿Qué se supone que debo hacer :S!?

    ResponderEliminar
  19. mmmm..... referencia Circular!!!!!.... luego mencionas que modificastes el fuente que no esta incluido!!!!!... entonces, si usastes algun programa para ver el fuente y lo estas copiando, entonces en este caso no te podria ayudar.

    Salu2 ;-)

    ResponderEliminar
  20. Lo podrias volver a poner la descarga por favor?.... esta muy interesante.

    ResponderEliminar
  21. Hola Marvin cual es el link de descarga del TexBoxEditor????
    Solo veo articulos relacionados

    ResponderEliminar
  22. Deberías poner un link de descarga al final del articulo.

    ResponderEliminar
  23. Jefes encontre esto: http://controlespersonalizadosvs2010.blogspot.com/2012/11/text-box-marca-de-agua.html es casi similar.

    ResponderEliminar
  24. podrias reparar el link de descarga !!!

    ResponderEliminar
  25. podrían poner el link

    ResponderEliminar
  26. Alguien podia facilitarme el Control TextEditor. Lo necesito.

    ResponderEliminar
  27. Hola Marvin. Podrias facilitarme el control TextEditor. Lo nesecito para cambiar cierto comportamiento de la propiedad MaskType y poder utilizar el DataGridViewEditorColumn. Favor lo necesito urgente.

    ResponderEliminar
    Respuestas
    1. Listo, donde dice "Proyecto de ejemplo" puedes descargar la dll.

      Salu2

      Eliminar
    2. Gracias por tu respuesta. Queria saber si tienes el codigo del texteditor(el fuente). Me seria de muy buena utilidad.

      Saludos.

      Eliminar
    3. No el fuente no esta disponible y si lo tengo porque yo lo hice

      Eliminar
    4. Hola Marvin. ¿Habria la posibilidad de poder obtenerlo?. El TextEditor me parece completo para lo que necesito, lo unico que me gustaria cambiar es el comportamiento de MaskType cuando es Currency o Numeric, ya que utilizan la configuración regional del sistema operativo y me gustaria controlarlo desde el mismo programa. Es decir, poder decirle la cantidad de decimales que necesito en diferentes entradas. Espero haya podido explicarme. Espero puedas ayudarme y al mismo tiempo agradecerte y felicitarte por las contribuciones que tanto usted como miles de programadores hacen a la comunidad. Me despido, Saludos y bendiciones.

      Eliminar

Publicar un comentario

Entradas populares de este blog

TextBox con Borde Personalizado

Bien, retomando nuevamente mi blog, luego de tanto tiempo ausente, veremos como personalizar el borde del control TextBox con un color diferente. hace poco vi en los foros de MSDN, en el foro de VB.Net esta pregunta, ¿ Cómo puedo cambiar el color del borde de un control TextBox ?, anteriormente también se hizo la misma pregunta en este mismo foro donde yo respondí como hacerlo VB2010 4.0 - Como crear un textbox personalizado . no hay manera fácil de personalizar un control, generalmente se tiene que sobre escribir el evento WndProc para escuchar los mensajes de window y reemplazar la funcionalidad de estos según sea la necesidad o el control. bien, para cambiar el color del borde del control TextBox sin mucha funcionalidad, se debe de escuchar y reemplazar el funcionamiento de los mensajes WM_PAINT y WM_NCPAINT . ¿ Porque WM_PAINT ?, porque cuando cambiamos la propiedad BorderStyle de este control a FixedSingle, quien pinta el borde es el mensaje WM_PAINT no asi el WM_NC

TextBox con Icon/Imagen

Bien, continuando con este articulo: TextBox con borde personalizado , ahora le dare la funcionalidad de poder mostrar un icono o imagen dentro del Control TextBox. Existen dos maneras de hacer esto: Pintar el icono/imagen dentro del control o Pintar el icono/imagen dentro del Non-Client Area del control. Pintar el icono/imagen dentro del control. Antes de escribir el código decidi googlear un poco, para ver si alguien más ya habia tenido la misma idea de usar el mensaje EM_SETMARGINS para dejar el espacio necesario para pintar el icono o imagen ya sea a la derecha o izquierda y me he encontrado con este articulo. Adding an Icon or Control to a TextBox or ComboBox . Pintar el icono/imagen de ntro del Non-Client Area del control. Us ando el Non- Client Area no encontre resultados googleando, así que es la forma que usar e para dib ujar un icono o imagen dentro de un control TextBox. En el control TextEditor que escrib í, utilizo esta manera para pintar el icono

Personalizar DataGridView (II) - Bloquear columnas de solo lectura

Personalizar DataGridView - Actualizaciones Personalizar DataGridView (II.1) - Bloquear columnas de solo lectura. Personalizar DataGridView (III) - Cambiar Diseñador. Bien, continuando con el articulo " Personalizar DataGridView (I) - Pintar área vacía ", ahora lo que haré es darle al control la funcionalidad de bloquear las columnas cuya propiedad " ReadOnly " se establezca en " true ", entiéndase por "Bloquear" el evitar que las columnas cuya propiedad " ReadOnly=true " puedan recibir el foco, ya sea por el teclado o por el ratón ( mouse ). Para tal objetivo agregare una nueva propiedad al control la cual llamare " AllowFocusReadOnlyColumns " cuyo valor predeterminado sera " true ", en caso de ser " false " las columnas marcadas como solo lectura no recibirán el foco. También le daré la funcionalidad de poder avanzar a la siguiente columna al presionar la tecla " ENTER " agregando otr