visual usar texto solo seleccionar que lectura foco evitar establecer escriban cuadro control como c# textbox

c# - usar - ¿Por qué el texto en el cuadro de texto está resaltado(seleccionado) cuando se muestra el formulario?



textbox solo lectura visual basic (6)

El comportamiento predeterminado de un TextBox en Windows Forms es resaltar todo el texto si se enfoca por primera vez al tabular en él, pero no si se hace clic en él. Podemos ver esto en Reflector mirando la anulación de OnGotFocus() TextBox :

protected override void OnGotFocus(EventArgs e) { base.OnGotFocus(e); if (!this.selectionSet) { this.selectionSet = true; if ((this.SelectionLength == 0) && (Control.MouseButtons == MouseButtons.None)) { base.SelectAll(); } } }

Es esa declaración si está causando el comportamiento que no nos gusta. Además, para colmo de males, el ajustador de la propiedad Text restablece ciegamente esa variable selectionSet cada vez que se reasigna el texto:

public override string Text { get { return base.Text; } set { base.Text = value; this.selectionSet = false; } }

Entonces, si tiene un TextBox y una pestaña, se seleccionará todo el texto. Si hace clic en él, se eliminará el resaltado y, si vuelve a tabular en él, se conservará su posición de intercalación (y la longitud de selección de cero). Pero si programáticamente establecemos nuevo Text y tabulamos en el Cuadro de Text nuevamente, entonces todo el texto será seleccionado nuevamente.

Si eres como yo y encuentras este comportamiento molesto e inconsistente, entonces hay dos formas de resolver este problema.

El primero, y probablemente el más fácil, es simplemente activar la configuración de selectionSet llamando a DeselectAll() en el formulario Load() y siempre que el Text cambie:

protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.textBox2.SelectionStart = this.textBox2.Text.Length; this.textBox2.DeselectAll(); }

( DeselectAll() simplemente establece SelectionLength en cero. En realidad, SelectionStart cambia la variable TextBox de TextBox . En el caso anterior, la llamada a DeselectAll() no es necesaria ya que estamos configurando el inicio hasta el final del texto. si lo establecemos en cualquier otra posición, como el comienzo del texto, llamarlo es una buena idea).

La forma más permanente es crear nuestro propio TextBox con el comportamiento deseado a través de la herencia:

public class NonSelectingTextBox : TextBox { // Base class has a selectionSet property, but its private. // We need to shadow with our own variable. If true, this means // "don''t mess with the selection, the user did it." private bool selectionSet; protected override void OnGotFocus(EventArgs e) { bool needToDeselect = false; // We don''t want to avoid calling the base implementation // completely. We mirror the logic that we are trying to avoid; // if the base implementation will select all of the text, we // set a boolean. if (!this.selectionSet) { this.selectionSet = true; if ((this.SelectionLength == 0) && (Control.MouseButtons == MouseButtons.None)) { needToDeselect = true; } } // Call the base implementation base.OnGotFocus(e); // Did we notice that the text was selected automatically? Let''s // de-select it and put the caret at the end. if (needToDeselect) { this.SelectionStart = this.Text.Length; this.DeselectAll(); } } public override string Text { get { return base.Text; } set { base.Text = value; // Update our copy of the variable since the // base implementation will have flipped its back. this.selectionSet = false; } } }

Quizás base.OnGotFocus() tentación de simplemente no llamar a base.OnGotFocus() , pero luego perderíamos funcionalidad útil en la clase base de Control . Y es posible que sienta la tentación de no meterse con la selectionSet Establecer una tontería y simplemente deseleccione el texto cada vez que lo haga en OnGotFocus (), pero luego perderíamos el resaltado del usuario si saltara del campo y retrocediera.

¿Feo? Puedes apostar. Pero es lo que es.

Tengo un formulario que contiene un cuadro de texto en C # que configuro en una cadena de la siguiente manera:

textBox.Text = str;

Cuando se muestra el formulario, ¿por qué el texto en el cuadro de texto aparece resaltado / seleccionado?


El cuadro de texto tiene un TabIndex de 0 y TabStop establecido en verdadero. Esto significa que el control se enfocará cuando se muestre el formulario.

Puede darle otro control al 0 TabIndex (si hay uno) y darle al cuadro de texto un índice de pestaña diferente (> 0), o establecer TabStop en falso para el cuadro de texto para evitar que esto suceda.


Las respuestas a esta pregunta me ayudaron mucho con un problema similar, pero la respuesta simple solo se insinúa con muchas otras sugerencias complejas. Simplemente configure SelectionStart en 0 después de configurar su texto. ¡Problema resuelto!

Ejemplo:

yourtextbox.Text = "asdf"; yourtextbox.SelectionStart = 0;


No he probado esto en C #, pero me encontré con el mismo problema usando un cuadro de diálogo C ++ WIN32. Parece que puede cambiar el comportamiento devolviendo FALSE desde OnInitDialog () o WM_INITDIALOG. Espero que esto ayude.


Para resaltar un campo de texto, con VS 2013, intente iniciar con:

myTextBox.GotFocus += new System.EventHandler(this.myTextBox_GotFocus);

Y agrega el método:

public void myTextBox_GotFocus(object sender, EventArgs e) { myTextBox.SelectionLength=0; }


También puede elegir el orden de tabulación para los controles de su formulario abriendo:

Ver-> Orden de tabulación

Tenga en cuenta que esta opción solo está disponible en "Ver" si tiene abierta la vista Diseño de formulario.

Seleccionar "Orden de tabulación" abre una vista del formulario que le permite elegir el orden de tabulación deseado haciendo clic en los controles.