2010-05-10 42 views
9

Estoy usando C#/.NET para una aplicación de Windows Forms. Tengo un cuadro de texto. ¿Cómo puedo hacer que el cuadro de texto no sea seleccionable?Cómo hacer que un cuadro de texto no se pueda seleccionar con C#

No quiero deshabilitar el cuadro de texto completo.

+0

usted va a tener que explicar más. Desactivar, por definición, está haciendo un control no seleccionable. A menos que ese control sea algo así como una etiqueta, que no es seleccionable para empezar, entonces el concepto de "no seleccionable" pero aún un cuadro de texto son mutuamente excluyentes. Por ejemplo, ¿cómo planea desplazar el texto en el cuadro de texto si no puede seleccionarlo? –

+0

Esto no es una solución, ya que el texto aún se podrá seleccionar, pero puede configurar el Cursor como predeterminado en lugar de IBeam. Esto hará que seleccionar el texto sea una opción de usuario menos obvia. "TextBox1.Label.Cursor = Cursors.Default; " – amalgamate

Respuesta

-3

Probar el uso de la propiedad CanFocus.

+7

CanFocus es de solo lectura. Está solo allí para indicar si el control puede recibir o no el foco. –

3

usted tiene un par de opciones:

  1. utilizar un control Label lugar.
  2. Establecer textBox.Enabled = false para evitar la selección (consulte here).
1

Probablemente la mejor manera es poner una etiqueta detrás de ella, y cuando desee desactivar el cuadro de texto, escóndalo y muéstrelo en su lugar.

9

En el caso de 'Intro' de la caja de texto establezca la ActiveControl a otra cosa:

private void txtMyTextbox_Enter(object sender, EventArgs e) 
    { 
     ActiveControl = objMyOtherControl; 
    } 
+2

@Chris: Buena opción. Sin embargo, cambiar con una etiqueta funcionaría si no está utilizando un richtextbox (aunque dijo "cuadro de texto"). Dependiendo del contenido, es posible que no pueda mostrarlo en una etiqueta. @Mystere Man: Un textbox/richtextbox se puede cambiar de tamaño con el código para acomodar completamente el texto. @Edglex: dijo que está trabajando con Windows Form. Focusable está disponible en WPF, pero no en Windows Forms. – Zesty

-3

@Mystere Hombre: Es posible que desee un cuadro de texto que no se puede utilizar todo el tiempo. Por ejemplo, le permito al usuario crear cuadros de texto en un lienzo y arrastrarlos alrededor. Para evitar que seleccionen y muevan texto cuando están arrastrando, necesito desautorizar la entrada del usuario, y la selección de texto también debe deshabilitarse porque causa un retraso que daña mi función de arrastre. En mi aplicación, el usuario solo puede editar un cuadro de texto cuando hace doble clic en él, y luego debe hacer clic fuera del cuadro de texto para poder moverlo nuevamente.

básicamente tengo este código (donde t es un cuadro de texto):

// Prevent text entry 
t.IsReadOnly = true; 

// Prevent text selection 
t.Focusable = false; 

Este comportamiento es preferible deshabilitar todo el control (t.Enabled = false), ya que también dejaría de eventos MouseDown y DoubleClick, que se detendría arrastrando y cambiando de editar al modo de arrastre de trabajo. Sin mencionar que el cuadro de texto se pondría gris.

+6

no existe ninguna propiedad llamada 'Focusable' para el [cuadro de texto de winforms] (http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox.aspx) – pb2q

+2

Debe estar pensando en' CanFocus' , que es de solo lectura, por lo que tu respuesta no tiene sentido. –

-2

Esto ha funcionado muy bien para mí:

textBox.ReadOnly = true 
+3

OP no dijo que lo querían ReadOnly, ¿o sí? –

+2

Hacer un TextBox 'ReadOnly' todavía permite la selección. Esto es *** no *** una solución a la pregunta del OP. –

3

que tenían el mismo problema. Tuve un diálogo y necesitaba que se mostrara el texto de líneas múltiples. No pude usar una etiqueta, ya que tiene que ser un cuadro de texto debido a la multilínea y el texto envolvente.

Primero lo enloquecí de solo lectura, pero si el cuadro de diálogo aparece iluminado por otras ventanas, se selecciona el texto que se ve horrible. Entonces encontré el problema.

En el programa de creación de formularios (como se llame), hay una propiedad para el TextBox llamada TabStop. Lo establecí en falso y el texto del cuadro de texto de solo lectura nunca se selecciona. Problema resuelto.

3

IsHitTestVisible="False" impide que el cuadro de texto muestre el cuadro delimitador al pasar el ratón o al hacer clic con el mouse. Eso fue suficiente en mi caso para aprovechar la función de envoltura de texto del cuadro de texto mientras lo hacía insensible a las acciones del usuario

+4

IsHitTestVisible es una función de WPF. No está disponible para Windows Forms. – LordWilmore

+0

Esa es, de lejos, la mejor solución si desea tener cuadros de texto editables en la vista de lista wpf, donde la propiedad IsReadOnly está enlazada a datos para hacer que solo un elemento se pueda editar a la vez. –

2

Los mensajes que causan el texto se pueden interceptar y bloquear. Pensé que EM_SETSEL sería todo lo que se requiere.Sin embargo, incluso cuando el mouse hace clic y arrastra, no hay ningún mensaje EM_SETEL, pero el texto aún se selecciona. Posiblemente uno de los mensajes tiene un puntero a una estructura que contiene la información.

Nota: No estoy seguro de si esto impide todas las formas de seleccionar texto.

public class TextBox2 : TextBox { 

    private const int EM_SETSEL = 0x00B1; 
    private const int WM_LBUTTONDBLCLK = 0x203; 
    private const int WM_MOUSEMOVE = 0x200; 
    private const int WM_KEYDOWN = 0x100; 
    private const int VK_CONTROL = 0x11; 
    private const int VK_SHIFT = 0x10; 

    public TextBox2() { 
     this.ShortcutsEnabled = false; // disabled right click menu 
     this.Cursor = Cursors.Default; 

    } 

    protected override void OnGotFocus(EventArgs e) { 
     base.OnGotFocus(e); 
     HideCaret(this.Handle); // doesn't work from OnHandleCreated 
    } 

    [DllImport("user32.dll")] 
    public static extern bool HideCaret(IntPtr hWnd); 

    public override bool PreProcessMessage(ref Message msg) { 
     // prevents the user from using the SHIFT or CTRL + arrow keys to select text 
     if (msg.Msg == WM_KEYDOWN) 
      return true; 

     return base.PreProcessMessage(ref msg); 
    } 

    protected override void WndProc(ref Message m) { 
     if (m.Msg == EM_SETSEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDBLCLK) 
      return; 

     base.WndProc(ref m); 
    } 
} 
0
private void textBox1_Click(object sender, EventArgs e) 
     { 
      this.textBox1.SelectionStart = this.textBox1.Text.Length; 
     } 

Y no se olvide de que: sólo lectura = true

Cuestiones relacionadas