2010-05-10 21 views
9

Sto usando C# /. NET per un'applicazione Windows Form. Ho una casella di testo. Come posso rendere la casella di testo non selezionabile?Come rendere una casella di testo non selezionabile utilizzando C#

Non voglio disabilitare la casella di testo completa.

+0

che si sta per bisogno di spiegare di più. La disattivazione, per definizione, rende impossibile il controllo. A meno che il controllo non sia qualcosa come un'etichetta, che non è selezionabile per cominciare, allora il concetto di "non selezionabile" ma comunque una casella di testo si escludono a vicenda. Ad esempio, come pensi di far scorrere il testo nella casella di testo se non riesci a selezionarlo? –

+0

Questa non è una correzione, poiché il testo sarà ancora selezionabile, ma è possibile impostare il cursore su Predefinito anziché su IBeam. Ciò renderà la selezione del testo una scelta meno ovvia per l'utente. "TextBox1.Label.Cursor = Cursors.Default; " – amalgamate

risposta

-3

Provare a utilizzare CanFocus proprietà.

+7

CanFocus è di sola lettura. È lì solo per indicare se il controllo può ricevere o meno il focus. –

3

Hai un paio di opzioni:

  1. utilizzare un controllo Label invece.
  2. Impostare textBox.Enabled = false per impedire la selezione (vedere here).
1

Probabilmente il modo migliore è mettere un'etichetta dietro di esso, e quando si desidera rendere la casella di testo disabilitata, nasconderla e mostrare l'etichetta al suo posto.

9

In caso 'Invio' della casella di testo impostare l'ActiveControl a qualcos'altro:

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

@Chris: buona opzione. Tuttavia, passare a un'etichetta funzionerebbe se non usasse un richtextbox (diceva "box di testo", comunque). A seconda del contenuto, potrebbe non essere in grado di visualizzarlo in un'etichetta. @Mystere Man: una casella di testo/richtextbox può essere ridimensionata con il codice per adattarsi completamente al testo. @Edglex: Ha detto che sta lavorando con un Windows Form. Focusable è disponibile in WPF, ma non in Windows Form. – Zesty

-3

@Mystere Man: Si potrebbe desiderare una casella di testo che non può essere utilizzato per tutto il tempo. Ad esempio, consento all'utente di creare caselle di testo su una tela e trascinarle. Per impedire loro di selezionare e spostare il testo durante il trascinamento, è necessario disabilitare l'input dell'utente e anche la selezione del testo deve essere disabilitata perché causa un ritardo che compromette la funzione di trascinamento. Nella mia applicazione l'utente può modificare una casella di testo solo quando ha fatto doppio clic su di esso e deve quindi fare clic all'esterno della casella di testo per poterlo spostare di nuovo.

Io fondamentalmente hanno questo codice (in cui t è un TextBox):

// Prevent text entry 
t.IsReadOnly = true; 

// Prevent text selection 
t.Focusable = false; 

Questo comportamento è preferibile disabilitando l'intero controllo (t.Enabled = false), poiché ciò anche arrestare eventi MouseDown e DoubleClick, che bloccherebbe trascinando e passando dalla modalità di modifica alla modalità di trascinamento dal lavoro. Per non parlare del fatto che la casella di testo diventerebbe grigia.

+6

non esiste una proprietà denominata "Focusable" per la [casella di testo winforms] (http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox.aspx) – pb2q

+2

È necessario pensare a 'CanFocus' , che è ReadOnly quindi la tua risposta non ha senso. –

-2

Questo ha funzionato bene per me:

textBox.ReadOnly = true 
+3

OP non ha detto di volerlo ReadOnly, vero? –

+2

La creazione di un oggetto TextBox 'ReadOnly' consente comunque la selezione. Questa non è una soluzione alla domanda dell'OP. –

3

Ho avuto lo stesso problema. Avevo una finestra di dialogo e avevo bisogno di visualizzare il testo multilinea. Non ho potuto utilizzare un'etichetta in quanto deve essere una casella di testo a causa della multilinea e del testo a capo.

La prima volta ho letto tutto solo, ma se la finestra di dialogo viene visualizzata da altre finestre, il testo diventa selezionato che sembra orribile. Quindi ho trovato il problema.

Nel programma di creazione moduli (qualunque sia il suo nome), esiste una proprietà per il controllo TextBox denominato TabStop. L'ho impostato su false e il testo della casella di testo di sola lettura non viene mai selezionato. Problema risolto.

3

IsHitTestVisible="False" impedisce alla casella di testo di visualizzare il rettangolo di selezione quando si passa il mouse o si fa clic con il mouse. Nel mio caso è stato sufficiente sfruttare la funzionalità textwrapping della casella di testo rendendola insensibile alle azioni dell'utente

+4

IsHitTestVisible è una funzione WPF. Non è disponibile per Windows Form. – LordWilmore

+0

Questa è di gran lunga la soluzione migliore se si desidera avere caselle di testo modificabili in wpf listview in cui la proprietà IsReadOnly è di tipo database per rendere modificabile un solo elemento alla volta. –

2

I messaggi che causano il testo possono essere intercettati e bloccati. Avrei pensato che lo EM_SETSEL sarebbe stato tutto ciò che è richiesto.Tuttavia, anche quando il mouse fa clic e trascina, non c'è il messaggio EM_SETEL, ma il testo viene comunque selezionato. Forse uno dei messaggi ha un puntatore a una struttura che contiene le informazioni.

Nota: non sono sicuro che ciò impedisca tutti i modi di selezionare il testo.

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

E non dimenticate che: read only = true

Problemi correlati