2008-11-09 25 views

Respuesta

49

NOTA: consulte la respuesta de Cheetah a continuación, ya que identifica un requisito previo para que funcione esta solución. Configurando el BackColor del TextBox.


Creo que lo que realmente quiere hacer es habilitar el TextBox y establezca la propiedad ReadOnly a true.

Es un poco complicado cambiar el color del texto en un TextBox deshabilitado. Creo que probablemente deba subclasificar y anular el evento OnPaint.

ReadOnly aunque debería darle el mismo resultado que !Enabled y le permite mantener el control del color y el formato del TextBox. Creo que también seguirá siendo compatible con la selección y copia de texto del TextBox que no es posible con un TextBox deshabilitado.

Otra alternativa simple es usar un Label en lugar de un TextBox.

+1

Funciona bien de esta manera también. ¡Gracias! –

+0

Si esta es su respuesta, haga clic en el control :) –

+0

No es una respuesta exacta, pero es una alternativa justa;) –

50

Además, para que ForeColor se obedezca en un TextBox marcado como ReadOnly, debe establecer explícitamente BackColor. Si desea que siga usando el BackColor predeterminado, debe hacer que el conjunto sea explícito, ya que el diseñador es demasiado inteligente para su propio beneficio aquí. Es suficiente para establecer BackColor a su valor actual. Lo hago en el evento Load del formulario, así:

private void FormFoo_Load(...) { 
    txtFoo.BackColor = txtFoo.BackColor; 
} 
+0

Gracias por la información, me preguntaba por qué no funcionaba. ¿Alguna idea de por qué exactamente está sucediendo esto? –

+4

IIRC, hay una bandera en algún lugar para verificar si los colores se han personalizado. Esa bandera no se establece a menos que se establezca BackColor. No puedo encontrarlo ahora, pero si hurgas en Reflector, es posible que puedas. – Cheetah

+1

+1. Sin embargo, esta creencia de los mendigos. – smirkingman

5

hi establecido el atributo de sólo lectura a la verdad desde el lado código o el tiempo de ejecución no desde el tiempo de diseño

txtFingerPrints.BackColor = System.Drawing.SystemColors.Info; 
txtFingerPrints.ReadOnly = true; 
1

Puede prueba esto. Reemplazar el evento OnPaint del TextBox.

protected override void OnPaint(PaintEventArgs e) 
{ 
    SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property 
    // Draw string to screen. 
    e.Graphics.DrawString(Text, Font, drawBrush, 0f,0f); //Use the Font property 
} 

establezca las ControlStyles a "UserPaint"

public MyTextBox()//constructor 
{ 
    // This call is required by the Windows.Forms Form Designer. 
    this.SetStyle(ControlStyles.UserPaint,true); 

    InitializeComponent(); 

    // TODO: Add any initialization after the InitForm call 
} 

Refrence

o puede intentar este truco

En Introduzca los acontecimiento ajustar el enfoque

int index=this.Controls.IndexOf(this.textBox1); 

this.Controls[index-1].Focus(); 

Entonces su control no se enfocará y se comportará como deshabilitado.

0

Si desea mostrar texto que no se puede editar o seleccionado puede simplemente usar una etiqueta

+0

No si tiene controles de validador en el cuadro de texto. Los validadores no funcionan en asp: etiquetas por desgracia. No es tan simple como pensaste en un principio. – Fandango68

0

Además de la respuesta por @ spoon16 y @Cheetah, siempre establece la propiedad tabstop en False en el cuadro de texto para evitar que el texto sea seleccionado por defecto.

Como alternativa, también se puede hacer algo como esto:

private void FormFoo_Load(...) { 
    txtFoo.Select(0, 0); 
} 

o

private void FormFoo_Load(...) { 
    txtFoo.SelectionLength = 0; 
} 
4

que acaba de encontrar una gran manera de hacer eso. En mi ejemplo estoy usando un RichTextBox pero debería funcionar con cualquier control:

public class DisabledRichTextBox : System.Windows.Forms.RichTextBox 
{ 
    // See: http://wiki.winehq.org/List_Of_Windows_Messages 

    private const int WM_SETFOCUS = 0x07; 
    private const int WM_ENABLE  = 0x0A; 
    private const int WM_SETCURSOR = 0x20; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (!(m.Msg == WM_SETFOCUS || m.Msg == WM_ENABLE || m.Msg == WM_SETCURSOR)) 
      base.WndProc(ref m); 
    } 
} 

Usted puede establecer con seguridad Activado = sí y ReadOnly = false, y que va a actuar como una etiqueta, evitando el enfoque, la entrada del usuario, cambio de cursor, sin estar realmente deshabilitado.

Vea si le funciona. Saludos

1

encarga solamente Habilitar cambiado y configurarlo para que el color que necesita

private void TextBoxName_EnabledChanged(System.Object sender, System.EventArgs e) 
{ 
    ((TextBox)sender).ForeColor = Color.Black; 
} 
Cuestiones relacionadas