2010-09-16 16 views
15

C'è un modo per disabilitare il cursore nella casella di testo senza impostare la proprietà Abilita su falso? Stavo cercando di usare la proprietà ReadOnly ma, nonostante il fatto che non posso scrivere nella casella di testo, il cursore appare se faccio clic sulla casella di testo. Quindi c'è un modo per sbarazzarsi di questo cursore in modo permanente?Come disabilitare il cursore nella casella di testo?

risposta

12

È possibile utilizzare invece Label. Quando nella finestra di progettazione, si imposta BorderStyle = Fixed3D, BackColor = Window e AutoSize = False, sembra molto simile a un controllo TextBox.

Tuttavia, il cursore in un TextBox viene fornito in modo che l'utente possa scorrere il testo quando è più lungo della casella. Perderai questa funzionalità con un'etichetta, a meno che tu non sia sicuro che si adatta sempre. Oltre a ciò, non è possibile rimuovere il cursore da un TextBox.

+0

Una casella di testo ReadOnly è utile anche per la visualizzazione di informazioni che l'utente potrebbe voler copiare e incollare da qualche altra parte. Usando un'etichetta (o disabilitando in altro modo il cursore) quell'abilità viene persa o ridotta. Ma se vuoi veramente visualizzare le informazioni senza la possibilità di selezionarle, allora un'etichetta è lo strumento giusto per il lavoro. –

+0

@JeffreyLWhitledge So che questa è una vecchia domanda, ma solo per appesantirla, cosa succede se l'utente richiede barre di scorrimento su un'etichetta? –

+0

@KyleT: Se hai una quantità di testo sufficientemente grande da richiedere le barre di scorrimento, ti suggerisco comunque di utilizzare un "TextBox" e di impostare la proprietà 'ReadOnly' su' true'. Il cursore qui è davvero bello da avere, poiché consente all'utente di selezionare parti del testo senza modificarlo. – Virtlink

17

In C#, è possibile utilizzare il seguente sola lettura casella di testo:

public class ReadOnlyTextBox : TextBox 
{ 
    [DllImport("user32.dll")] 
    static extern bool HideCaret(IntPtr hWnd); 

    public ReadOnlyTextBox() 
    { 
     this.ReadOnly = true; 
     this.BackColor = Color.White; 
     this.GotFocus += TextBoxGotFocus; 
     this.Cursor = Cursors.Arrow; // mouse cursor like in other controls 
    } 

    private void TextBoxGotFocus(object sender, EventArgs args) 
    { 
     HideCaret(this.Handle); 
    } 
} 
+0

Perché impostare il 'BackColor'? Windows si occupa già di questo per abbinare il tema del sistema dell'utente. –

+0

@Mikhail Semenov Sono nuovo in C#, come richiamare questo evento 'TextBoxGotFocus', non è presente anche negli eventi. aiuto di pls .. –

+0

Questo ha funzionato perfettamente per un RichTextBox in cui stavo avendo un problema simile. Il codice in ReadOnlyTextBox() è superfluo. – OfficeAddinDev

-3

è possibile utilizzare RightToLeft proprietà della casella di testo, impostare a true, non sarà possibile eliminare il cursore, ma verrà corretto nell'angolo destro e non apparirà automaticamente dopo ogni testo digitato nella casella di testo. Ho usato questo per sviluppare un'applicazione come Windows Calculator.

+3

peggiora solo le cose. Cambia anche l'allineamento, il cursore appare ancora dove si fa clic e selezionando il testo è ... strano. –

8

In C# è possibile disattivare il cursore in una casella di testo disattivando temporaneamente e riabilitando la casella di testo ogni volta che riceve lo stato attivo. Nota: non è necessario che la casella di testo venga letta solo se si utilizza questo metodo. Per esempio:

private void TextBox_Enter(object sender, EventArgs e) 
{ 
    TextBox.Enabled = false; 
    TextBox.Enabled = true; 
} 
4

se si mette la funzione hideCaret all'interno TextChange, questo risolverà il problema.

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

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     HideCaret(textBox1.Handle); 
    } 
0

È possibile impostarlo in modo programmatico.

textBox1.Cursor = Cursors.Arrow; 
0

La soluzione più semplice per me era ignorare l'evento su focus e concentrarsi sul genitore. Ciò impedisce il cursore e qualsiasi modifica della casella di testo da parte dell'utente e in pratica disabilita la casella di testo senza dover impostare la proprietà Enabled = false.

private void Form1_load(object sender, EventArgs e) { 
    textBox1.ReadOnly = true; 
    textBox1.Cursor = Cursors.Arrow; 
    textBox1.GotFocus += textBox1_GotFocus; 
} 


private void textBox1_GotFocus(object sender, EventArgs e) { 
    ((TextBox)sender).Parent.Focus(); 
} 
Problemi correlati