2008-11-09 17 views

Odpowiedz

49

UWAGA: zobacz poniżej odpowiedź Cheetah, ponieważ określa ona warunek konieczny do uruchomienia tego rozwiązania. Ustawianie BackColor z .


myślę, co naprawdę chcesz zrobić, to włączyć TextBox i ustawić właściwość ReadOnly do true.

Zmiana koloru tekstu w zablokowanym TextBox jest nieco trudna. Myślę, że prawdopodobnie będziesz musiał podklasować i nadpisać zdarzenie OnPaint.

ReadOnly jednak powinien dać taki sam wynik, jak !Enabled i pozwala zachować kontrolę nad kolorem i formatowaniem TextBox. Myślę, że nadal będzie on obsługiwał wybieranie i kopiowanie tekstu z urządzenia TextBox, co nie jest możliwe w przypadku wyłączonego urządzenia TextBox.

Inną prostą alternatywą jest użycie Label zamiast TextBox.

+1

Działa to również w ten sposób. Dzięki! –

+0

Jeśli to jest twoja odpowiedź, idź dalej i kliknij sprawdź dla mnie :) –

+0

To nie jest dokładna odpowiedź, ale jest to uczciwa alternatywa;) –

50

Dodatkowo, aby ForeColor był przestrzegany w TextBox oznaczonym jako ReadOnly, musisz jawnie ustawić kolor BackColor. Jeśli chcesz go nadal używać domyślnego BackColor, musisz ustawić zestaw wyraźnie, ponieważ projektant jest zbyt inteligentny dla własnego dobra tutaj. Wystarczy ustawić kolor BackColor na aktualną wartość. Robię to w przypadku obciążenia dla postaci, tak jak poniżej:

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

Dzięki za informację, zastanawiałem się, dlaczego to nie działa! Każdy pomysł, dlaczego tak się dzieje? –

+4

IIRC, gdzieś jest flaga, aby sprawdzić, czy kolory zostały dostosowane. Ta flaga nie zostanie ustawiona, dopóki nie zostanie ustawiona opcja BackColor. Nie mogę tego teraz znaleźć, ale jeśli zaczniesz grzebać w Reflectorze, być może będziesz w stanie. – Cheetah

+1

+1. To jednak przypuszcza żebrak. – smirkingman

5

hi ustawić atrybut tylko do odczytu, aby prawda od strony kodowej lub uruchomić czasu nie od momentu projektowania

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

Można Spróbuj tego. Zastępuje zdarzenie OnPaint w 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 
} 

ustawić ControlStyles do "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

Albo możesz spróbować tej siekać

W Wpisz wydarzenie ustawić ostrość

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

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

Więc twoja kontrola nie będzie skupiona i zachowa się jak wyłączona.

0

Jeśli chcesz wyświetlać tekst, które nie mogą być edytowane lub wybrany można po prostu użyć etykiety

+0

Nie, jeśli masz sprawdzanie poprawności względem pola tekstowego. Validators nie działają na asp: etykiety niestety. Nie tak proste, jak początkowo sądziłeś. – Fandango68

0

Ponadto do odpowiedzi przez @ spoon16 i @Cheetah, zawsze należy ustawić właściwość tabstop False w polu tekstowym do zapobiega domyślnemu wybraniu tekstu.

Alternatywnie, można też zrobić coś takiego:

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

lub

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

Właśnie znalazł świetny sposób to robić. W moim przykładzie używam RichTextBox ale powinien działać z każdym Kontroli:

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

Można bezpiecznie ustawić Enabled = true i false ReadOnly = i będzie działać jak etykiety, zapobiegając focus, wprowadzania danych przez użytkownika, zmiana kursora, bez faktycznego wyłączenia.

Sprawdź, czy to działa. Pozdrowienia

1

Wystarczy obsłużyć Włącz zmianie i ustawić go do koloru trzeba

private void TextBoxName_EnabledChanged(System.Object sender, System.EventArgs e) 
{ 
    ((TextBox)sender).ForeColor = Color.Black; 
} 
Powiązane problemy