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:
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.
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:
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 personalizadoTextBox con Icon/Imagen
DataGridViewTextEditorColumn
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
ResponderEliminarHola Michael,
ResponderEliminarprobe 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,
Marvin, la demo no se encuentra en linea para descargar
EliminarTe mando un abrazo
Gonzalo
gmaniero@palmaresopen.com.ar
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!!!
ResponderEliminarToma 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.
ResponderEliminaryo estoy creando un instalador para que sea mas facil agregarla al ToolBox del Visual Studio, lo estare publicando entre hoy y mañana.
Salu2,
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 ...
ResponderEliminarHola Marvin, a ver si me puedes echar una mano
ResponderEliminarAl 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....
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.
EliminarSalu2,
Gracias.
EliminarHola otra vez.
ResponderEliminarYa 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?
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.
ResponderEliminarSalu2,
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
Eliminarprivate void textEditor1_ButtonClick(object sender, TextEditor.ButtonPressedEventArgs e)
{
MessageBox.Show("Presionado boton", "TextEditorButton");
}
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.
Eliminarlo puedes subir a SkyDriver para que yo lo pueda descargar.
Salu2,
Gracias Marvin
EliminarLo 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.
Hola Marvin
ResponderEliminar¿Cómo identifico el Item pulsado del control NetBarControl?
si te fijas... los Items tienen un unico metodo llamado "ItemClick" este recibe dos parametros:
Eliminarprivate 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,
Gracias Marvin
EliminarUna 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.
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.
EliminarSalu2,
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...
ResponderEliminarEsto 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.
EliminarSalu2,
Marvin, muy buen control... solo es que necesito el texteditor con multilinea ¿Es posible?
ResponderEliminarSi es así ... ¿Cómo lo hago?
Gracias!
No, no es posible
ResponderEliminarHola Marvin:
ResponderEliminarUnas 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
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.
EliminarSalu2
Mucha Gracias por responder Marvin, seguimos al pendiente para ver tus nuevos controles.
ResponderEliminarUn abrazo y admiración por tu trabajo!
Luis Escobar
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.
ResponderEliminarMe 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á
Hola Shaymon,
Eliminarel 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,
Hola Marvin:
ResponderEliminarProbando 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
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...
EliminarSaludos!
Luis Escobar
Hola Marvin, Excelente tu control TextEditor
ResponderEliminarlo 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?
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.
EliminarSalu2,
Hola Marvin, muy bueno el control textEditor.
ResponderEliminarSolo una pregunta, ¿es posible descargar el código para estudiarlo?
Muchas gracias.
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.
EliminarSalu2,
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...
ResponderEliminarEspero 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!?
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.
ResponderEliminarSalu2 ;-)
Lo podrias volver a poner la descarga por favor?.... esta muy interesante.
ResponderEliminarHola Marvin cual es el link de descarga del TexBoxEditor????
ResponderEliminarSolo veo articulos relacionados
Deberías poner un link de descarga al final del articulo.
ResponderEliminarJefes encontre esto: http://controlespersonalizadosvs2010.blogspot.com/2012/11/text-box-marca-de-agua.html es casi similar.
ResponderEliminarpodrias reparar el link de descarga !!!
ResponderEliminarpodrían poner el link
ResponderEliminarAlguien podia facilitarme el Control TextEditor. Lo necesito.
ResponderEliminarHola 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.
ResponderEliminarListo, donde dice "Proyecto de ejemplo" puedes descargar la dll.
EliminarSalu2
Gracias por tu respuesta. Queria saber si tienes el codigo del texteditor(el fuente). Me seria de muy buena utilidad.
EliminarSaludos.
No el fuente no esta disponible y si lo tengo porque yo lo hice
EliminarHola 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