web-dev-qa-db-ger.com

Wie kann ich die Schriftfarbe einer deaktivierten TextBox ändern?

Weiß jemand, welche Eigenschaft die Textfarbe für deaktiviertes Steuerelement festlegt? Ich muss etwas Text in einer deaktivierten TextBox anzeigen, und ich möchte seine Farbe auf Schwarz setzen.

55
Niko Gamulin

HINWEIS: siehe Cheetahs Antwort unten, da er eine Voraussetzung dafür darstellt, dass diese Lösung funktioniert. BackColor der TextBox einstellen.


Ich glaube, Sie möchten wirklich die Variable TextBox aktivieren und die Eigenschaft ReadOnly auf true setzen.

Es ist ein bisschen schwierig, die Farbe des Textes in einer deaktivierten TextBox zu ändern. Ich denke, Sie müssten wahrscheinlich das Ereignis OnPaint überschreiben und überschreiben.

ReadOnly sollte jedoch dasselbe Ergebnis wie !Enabled liefern und die Kontrolle über Farbe und Formatierung der TextBox behalten. Ich denke, es wird auch weiterhin das Auswählen und Kopieren von Text aus der TextBox unterstützen, was bei deaktivierter TextBox nicht möglich ist.

Eine andere einfache Alternative ist die Verwendung einer Label anstelle einer TextBox.

51
Eric Schoonover

Damit ForeColor einer mit ReadOnly gekennzeichneten TextBox befolgt werden kann, müssen Sie außerdem explizit die BackColor festlegen. Wenn Sie möchten, dass die Standard-BackColor weiterhin verwendet wird, müssen Sie das Set explizit machen, da der Designer hier zu schlau ist. Es reicht aus, die BackColor auf ihren aktuellen Wert zu setzen. Ich mache das im Load-Event für das Formular, wie folgt:

private void FormFoo_Load(...) {
    txtFoo.BackColor = txtFoo.BackColor;
}
52
Cheetah

hi setzt das readonly-Attribut von der Codeseite oder der Laufzeit nicht von der Entwurfszeit auf true 

txtFingerPrints.BackColor = System.Drawing.SystemColors.Info;
txtFingerPrints.ReadOnly = true;
5
syed qaiser

Ich habe gerade einen großartigen Weg gefunden, das zu tun. In meinem Beispiel verwende ich eine RichTextBox, aber es sollte mit jedem Control funktionieren:

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);
    }
}

Sie können Enabled = true und ReadOnly = false festlegen, und es wirkt wie eine Beschriftung, wodurch Fokus, Benutzereingabe und Cursorwechsel verhindert werden, ohne dass dies tatsächlich deaktiviert wird.

Sehen Sie, ob es für Sie funktioniert

4
edoedoedo

Sie können dies versuchen. Überschreiben Sie das OnPaint-Ereignis der 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
}

setzen Sie die ControlStyles auf "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
}

Erfrischung

Oder Sie können diesen Hack versuchen

Stellen Sie im Enter-Ereignis den Fokus ein

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

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

So wird Ihre Steuerung nicht fokussiert und verhält sich wie deaktiviert.

2
Zain Ali

Behandeln Sie einfach die Option "Ändern" und stellen Sie die gewünschte Farbe ein

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

Wenn Sie Text anzeigen möchten, der nicht bearbeitet oder ausgewählt werden kann, können Sie einfach eine Beschriftung verwenden

0
karl f

Zusätzlich zu der Antwort von @ spoon16 und @Cheetah setze ich die tabstop-Eigenschaft im Textfeld immer auf False, um zu verhindern, dass der Text standardmäßig ausgewählt wird.

Alternativ können Sie auch so etwas tun:

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

oder 

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