2010-03-09 14 views
6

Tengo un programa de Winforms C# con múltiples cuadros de texto. Usé las propiedades de cada cuadro para colocar texto en ellos, explicando al usuario qué valor va en ellos. Quiero que el texto se resalte cada vez que un usuario selecciona ese cuadro. Haciendo clic o haciendo clic con el mouse. No tendré que hacer esto si hay una manera de mostrar qué valor va en el cuadro de texto en algún lugar fuera de él.¿Cómo destaco el texto en un cuadro de texto en un programa C# Winforms?

Probé el método Textbox.select pero no tuvo ningún efecto. Lo mismo con this.

Aquí hay un Screenshot de mi programa.

Mi Código:

private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
    { 
     grapplingText1.SelectionStart = 0; 
     grapplingText1.SelectionLength = grapplingText1.Text.Length; 

hará esto, o es más necesaria?

+0

Si ha probado dos soluciones ... la segunda * debería * haber funcionado ... podría ser un error en el código. ¿Podría proporcionar el código que realmente utilizó? – Nick

+0

Publiqué el código. Avísame si es suficiente para continuar. – Slateboard

+0

¿Alguna solución lo ayudó con lo que quería lograr? – MadBoy

Respuesta

8

¿Qué tal si asignas ToolTip a TextBox y pones toda la "conversación para qué es el cuadro de texto" dentro de eso?

Simplemente arrastre & baje ToolTip dentro del formulario. Y luego, en cada propiedad TextBox, debe tener una entrada adicional en la sección Miscelánea ToolTip en toolTip1 (o lo que sea, su nombre será si le cambia el nombre).

Luego, cuando el usuario pasa el cursor sobre TextBox (Solo lectura/Desactivado TextBox no parece mostrar información sobre herramientas) y se detiene allí durante 1 segundo La información sobre herramientas debe mostrarse con la información adecuada.

Eventualmente puede o mejor aún tiene un Label junto a TextBox es decir lo es, pero tener un ToolTip es también una buena idea explicar más información al usuario a través de eso.

Para hacer cosas con WaterMark para que no tenga que recorrer un largo camino configurando los eventos, cuidando SelectAll etc., podría hacerlo así. Cree un nuevo archivo watermark.cs y reemplácelo con este código. Asegúrese de haber cambiado el espacio de nombres para que coincida con el espacio de nombres de su programa.

#region 
using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

#endregion 

namespace Watermark { 
    public static class TextBoxWatermarkExtensionMethod { 
     private const uint ECM_FIRST = 0x1500; 
     private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
     public static void SetWatermark(this TextBox textBox, string watermarkText) { 
      SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); 
     } 
    } 
} 
    internal class WatermarkTextBox : TextBox { 
    private const uint ECM_FIRST = 0x1500; 
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
    private string watermarkText; 
    public string WatermarkText { 
     get { return watermarkText; } 
     set { 
      watermarkText = value; 
      SetWatermark(watermarkText); 
     } 
    } 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
    private void SetWatermark(string watermarkText) { 
     SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText); 
    } 
} 

En su Formulario de activar así:

textBoxYourWhatever.SetWatermark("Text that should display"); 

Se queda allí mientras la TextBox está vacía. Cuando los usuarios entran en TextBox, el texto desaparece. Aparece de nuevo cuando se limpia TextBox (ya sea por el usuario o automáticamente). No hay necesidad de eventos especiales, etc.

EDIT:

He añadido también WaterMarkTextBox clase interna que le da la opción de utilizar simplemente WaterMarkTexBox nueva que esté disponible en Designer. Luego arrástralo y suéltalo a tu diseñador y úsalo. Se comporta como el cuadro de texto normal solo le da campo adicional WaterMarkText.

Sigo prefiriendo el primer método. No te hace reconstruir tu GUI nuevamente.

+0

+1 Voy a mantener su ejemplo, me parece muy útil =) – Javier

+0

Lo probé y el error que he dicho: Los métodos de extensión deben definirse en una clase estática de nivel superior; TextBoxWatermarkExtensionMethod es una clase anidada ¿Qué estoy haciendo mal? Además, .SetWatermark no aparece en la autocompletar. – Slateboard

+0

Supongo, por ese error, que has puesto la clase Extensions dentro de otra clase. No puedes hacer esto. Debe ser una clase de nivel superior. Una vez que haga esto y compila, SetWatermark aparecerá en IntelliSense. –

7

Creo que .select funcionará si conoce la cantidad de texto que desea seleccionar.

Pruebe .SelectAll(); Debería funcionar para usted

3

Debe usar el TextBox.Focus() para centrarse en su control, y si no funciona automáticamente, simplemente llame al método SelectAll() en el evento Enter().

private TextBox1_Enter(object sender, EventArgs e) {  
    TextBoxTextHighlight(sender, null); 
} 

private TextBox2_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

private TextBox3_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

// And so forth... 

private void TextBoxTextHighlight(object sender, EventArgs e) { 
    (sender as TextBox).SelectAll(); 
} 

Este método le permitirá llamarlo desde cualquier controlador de eventos TextBoxX_Enter(). De lo contrario, incluso podría crear un nuevo UserControl, llámelo como desee al crearlo, luego, cuando lo cree en su proyecto, edite el código y reemplace la herencia de la clase UserControl por la clase TextBox, luego defina el comportamiento por defecto que le gustaría tener en el evento Enter(), al igual que esta llamada al método Seleccionar Todo(), y que sea protegido virtual, y dentro del constructor, puede suscribirse al controlador de eventos, así:

public partial class CustomTextBox : TextBox { 
    public CustomTextBox() 
     : base() { 
     this.Enter += new EventHandler(Enter); 
    } 

    protected virtual Enter(object sender, EventArgs e) { 
     this.SelectAll(); 
    } 
} 

Lo escribí sobre la marcha, por lo que tal vez se requieran algunas modificaciones, pero es posible que se haga una idea. Pero no te aconsejo que lo hagas a menos que realmente valga la pena hacerlo para tu situación adecuada. Cuanto más simple, mejor y más simple es crear un controlador de eventos para cada uno de los cuadros de texto de tu formulario y luego llamar al método TextBoxTextHighlight().

+0

Hago esto para cada cuadro de texto? – Slateboard

+0

Al hacer doble clic en el evento Enter() de la lista de eventos de la ventana de propiedades para cada cuadro de texto, podrá escribir la línea de código en el controlador de eventos TextBox1_Enter() y propagar la funcionalidad de SelectAll() sin demasiado esfuerzo. Entonces sí, para cada TextBox. –

2

Supongamos que su nombre es textbox's 'MyTextBox'

Puede escribir el método para controlar el evento Focus:

private void MyTextBox_GotFocus(object sender, EventArgs e) 
{ 
    MyTextBox.SelectionStart = 0; 
    MyTextBox.SelectionLength = MyTextBox.Text.Length; 
    MyTextBox.Select(); 
} 

que tenga; necesitará para agregar el controlador de eventos también:

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 

Esto debería funcionar ...

EDITAR

Se puede utilizar el mismo método para otra caja de texto, sólo tiene que añadir el controlador de eventos:

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
//... 
+0

¿Reemplaza el código ya ingresado? – Slateboard

+0

Sí lo hace, al menos, he hecho una prueba con este código, y funciona bien =) – Javier

+0

Reemplazo todas las instancias de mytextbox con los nombres de mis cuadros de texto reales, ¿verdad? – Slateboard

2

Por lo general, si se quiere explicar al usuario lo que pasa en un cuadro de texto, coloca un control Label directamente encima, (o hacia un lado).

A veces, para guardar la pantalla de bienes raíces, puede poner una descripción del texto dentro de del propio cuadro de texto. Esto se llama watermark.

+0

Bueno, los cuadros de texto actualmente muestran descripciones de texto dentro de ellos, así que, ¿eso es lo que quiere decir con una marca de agua? – Slateboard

+0

Marca de agua es como un texto incorporado que no tendrá que cuidar cuando el usuario intente escribir cosas en ese TextBox. Siempre aparece cuando TextBox está vacío, y se va cuando hay Text Inside. – MadBoy

+0

Derecha. Un buen ejemplo de la marca de agua es el cuadro de texto de búsqueda en la esquina superior derecha de stackoverflow. La desventaja de la marca de agua es que no se puede saber a qué se supone que significa el valor cuando se rellena. En cuanto a su captura de pantalla, debería recomendar que use los controles de Etiqueta, colocados directamente encima de los cuadros de texto. –

0

La forma más sencilla de mostrar información adicional al pasar el ratón sobre un elemento sería utilizar una información sobre herramientas. He intentado un enfoque de marca de agua similar, pero al ver que no hay forma inmediata de implementarlo, la información sobre herramientas parecía ser una alternativa adecuada.

Se puede ver cómo ponerlo en práctica en el siguiente enlace: Implementing a tooltip

+0

Verifique mi respuesta de manera inmediata para implementar la marca de agua. Fácil de implementar y usar. – MadBoy

+0

Increíble, buen trabajo. –

-1

he encontrado que en mi solicitud, adjuntando el método de selección al Focus -> Introduzca los acontecimiento que no funcionó bien con el Seleccionar Todo() método. En su lugar, utilicé Acción -> Hacer clic (que creo que solo funciona para ratones) y adjunté mi método de resaltado allí. Ahora funciona como un encanto!

Cuestiones relacionadas