2010-03-09 22 views
6

Ho un programma Win # C con più caselle di testo. Ho usato le proprietà di ciascuna casella per inserire del testo al loro interno, spiegando all'utente quale valore va inserito in esse. Voglio che il testo si evidenzi ogni volta che un utente seleziona quella casella. Tramite tab o click del mouse. Non dovrò farlo se c'è un modo per mostrare quale valore va nella casella di testo da qualche parte al di fuori di esso.Come si evidenzia il testo in una casella di testo in un programma Winforms C#?

Ho provato il metodo Textbox.select ma non ha avuto alcun effetto. Lo stesso con this.

Ecco uno Screenshot del mio programma.

My Code:

private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) 
    { 
     grapplingText1.SelectionStart = 0; 
     grapplingText1.SelectionLength = grapplingText1.Text.Length; 

Sarà questo fare, o è più necessaria?

+0

Se hai provato due soluzioni ... il secondo * dovrebbe * aver funzionato ... potrebbe essere un bug nel codice. Potresti fornire il codice che hai effettivamente utilizzato? – Nick

+0

Ho pubblicato il codice. Fammi sapere se è abbastanza per andare avanti. – Slateboard

+0

Quindi qualsiasi soluzione ti ha aiutato con quello che volevi ottenere? – MadBoy

risposta

8

Che ne dici di assegnare ToolTip a TextBox e mettere tutto il "parlare di quale casella di testo è per" al suo interno?

Basta trascinare & rilasciare ToolTip all'interno del modulo. E poi in ogni proprietà dovresti avere una voce aggiuntiva nella sezione Misc ToolTip su toolTip1 (o qualunque sia il suo nome se la rinomassi).

Quindi quando l'utente passa sopra TextBox (Sola lettura/Disabilitato TextBox sembra non visualizzare le descrizioni) e si ferma lì per 1 secondo che ToolTip dovrebbe mostrare con le informazioni corrette.

È alla fine o, meglio ancora possibile avere un Label accanto al TextBox dire ciò che è è, ma avere un ToolTip è anche una buona idea per spiegare ulteriori informazioni all'utente attraverso questo.

Per fare cose con WaterMark in modo da non dover percorrere la strada impostando gli eventi, avendo cura di SelectAll ecc. Si potrebbe fare così. Crea un nuovo file watermark.cs e sostituiscilo con questo codice. Assicurati di aver cambiato lo spazio dei nomi in modo che corrisponda al tuo spazio dei nomi del programma.

#region 
using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

#endregion 

namespace Watermark { 
    public static class TextBoxWatermarkExtensionMethod { 
     private const uint ECM_FIRST = 0x1500; 
     private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
     public static void SetWatermark(this TextBox textBox, string watermarkText) { 
      SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); 
     } 
    } 
} 
    internal class WatermarkTextBox : TextBox { 
    private const uint ECM_FIRST = 0x1500; 
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1; 
    private string watermarkText; 
    public string WatermarkText { 
     get { return watermarkText; } 
     set { 
      watermarkText = value; 
      SetWatermark(watermarkText); 
     } 
    } 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 
    private void SetWatermark(string watermarkText) { 
     SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText); 
    } 
} 

nel modulo si attiva in questo modo:

textBoxYourWhatever.SetWatermark("Text that should display"); 

rimane lì il più a lungo il TextBox è vuoto. Quando gli utenti entrano nel testo TextBox scompaiono. Appare nuovamente quando viene pulito TextBox (dall'utente o automaticamente). Non c'è bisogno di tutti gli eventi speciali, ecc

EDIT:

ho aggiunto anche di classe WaterMarkTextBox interno che ti dà la possibilità di usare semplicemente nuova WaterMarkTexBox che diventa disponibile in Designer. Quindi trascinalo sul tuo designer e usalo. Si comporta come una normale casella di testo e ti fornisce un campo aggiuntivo WaterMarkText.

Preferisco ancora il primo metodo. Non ti fa ricostruire di nuovo il tuo gui.

+0

+1 Terrò il tuo esempio, lo trovo molto utile =) – Javier

+0

Ho provato e l'errore che ho dichiarato: I metodi di estensione devono essere definiti in una classe statica di primo livello; TextBoxWatermarkExtensionMethod è una classe nidificata Cosa sto facendo male? Inoltre, .SetWatermark non è elencato nel completamento automatico. – Slateboard

+0

Sto indovinando, da quell'errore, che hai inserito la classe Extensions all'interno di un'altra classe. Non puoi farlo. Deve essere una classe di alto livello. Una volta che lo fai, e lo compila, SetWatermark apparirà in IntelliSense. –

7

Penso che .select funzionerà se si conosce l'importo del testo che si desidera selezionare.

Try .SelectAll(); Dovrebbe funzionare per voi

3

È necessario utilizzare TextBox.Focus() per concentrarsi sul controllo e, se non funziona automaticamente, chiamare semplicemente il metodo SelectAll() sull'evento Enter().

private TextBox1_Enter(object sender, EventArgs e) {  
    TextBoxTextHighlight(sender, null); 
} 

private TextBox2_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

private TextBox3_Enter(object sender, EventArgs e) { 
    TextBoxTextHighlight(sender, null); 
} 

// And so forth... 

private void TextBoxTextHighlight(object sender, EventArgs e) { 
    (sender as TextBox).SelectAll(); 
} 

Questo metodo consente di chiamarlo da qualsiasi gestore di eventi TextBoxX_Enter().

Altrimenti, potresti persino creare un nuovo UserControl, chiamarlo come desideri al momento della creazione, quindi, una volta creato nel tuo progetto, modificare il codice e sostituire l'ereditarietà della classe UserControl con la classe TextBox, quindi definire al suo interno il comportamento di default che si vorrebbe avere sulla manifestazione Invio(), come questa chiamata al metodo SelectAll(), e renderlo protetto virtuale, e all'interno del costruttore, si può sottoscrivere il gestore di eventi in questo modo:

public partial class CustomTextBox : TextBox { 
    public CustomTextBox() 
     : base() { 
     this.Enter += new EventHandler(Enter); 
    } 

    protected virtual Enter(object sender, EventArgs e) { 
     this.SelectAll(); 
    } 
} 

L'ho scritto al volo, quindi forse sono necessarie alcune modifiche, ma potresti avere l'idea. Ma non ti consiglio di farlo a meno che non sia davvero degno farlo per la tua situazione corretta. Più semplice è, meglio è, e il più semplice è creare un gestore di eventi per ciascun TextBox del modulo e quindi chiamare il metodo TextBoxTextHighlight().

+0

Lo faccio per ogni casella di testo? – Slateboard

+0

Fare doppio clic sull'evento Enter() dall'elenco delle proprietà della finestra delle proprietà per ogni TextBox consentirà di scrivere la riga di codice nel gestore di eventi TextBox1_Enter() e di propagare la funzionalità di SelectAll() senza troppa fatica. Quindi sì, per ogni TextBox. –

2

Supponiamo che il tuo nome è textbox's 'MyTextBox'

È possibile scrivere il metodo per gestire l'evento Focus:

private void MyTextBox_GotFocus(object sender, EventArgs e) 
{ 
    MyTextBox.SelectionStart = 0; 
    MyTextBox.SelectionLength = MyTextBox.Text.Length; 
    MyTextBox.Select(); 
} 

avrete modo necessario aggiungere il gestore di eventi troppo:

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 

Questo dovrebbe funzionare ...

EDIT

È possibile utilizzare lo stesso metodo per altri casella di testo, basta aggiungere il gestore di eventi:

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus); 
//... 
+0

Sostituisce il codice già inserito? – Slateboard

+0

Sì, almeno, ho fatto un test con questo codice, e funziona bene =) – Javier

+0

Sostituisco tutte le istanze di mytextbox con i nomi delle mie attuali caselle di testo, giusto? – Slateboard

2

In genere, se si vuole spiegare all'utente che cosa va in una casella di testo, si posiziona un controllo Label direttamente sopra di esso, (o sul lato).

A volte però, per salvare lo schermo immobiliare, è possibile inserire una descrizione del testo all'interno della casella di testo. Questo è chiamato watermark.

+0

Bene, le caselle di testo al momento visualizzano descrizioni di testo al loro interno, quindi è questo che intendete per filigrana? – Slateboard

+0

La filigrana è come un testo integrato di cui non dovrai preoccuparti quando l'utente prova a digitare contenuti in quel TextBox. Si presenta sempre quando TextBox è vuoto, ed è sparito quando c'è Text Inside. – MadBoy

+0

Giusto. Un buon esempio della filigrana è la casella di testo di ricerca in alto a destra dello stackoverflow. Lo svantaggio della filigrana è che non si può sapere cosa significherà il valore quando viene compilato. Guardando il tuo screenshot, dovrei raccomandare di usare i controlli Label, posizionati direttamente sopra le caselle di testo. –

0

Il modo più semplice per mostrare alcune informazioni aggiuntive al passaggio del mouse su un elemento consiste nell'utilizzare un suggerimento. Ho provato un approccio simile alla filigrana, ma avendo scoperto che non esiste un modo immediato per implementarlo, il Tooltip sembrava essere un'alternativa adatta.

Si può vedere come implementarlo al seguente link: Implementing a tooltip

+0

Controlla la mia risposta per l'implementazione immediata del watermark Facile da implementare e utilizzare – MadBoy

+0

Impressionante, bel lavoro. –

-1

Ho scoperto che nella mia richiesta, allegando il metodo evidenziazione Focus -> Inserisci evento non ha funzionato bene con il SelectAll() metodo. Ho invece usato Action -> Click (che credo funzioni solo per i mouse) e ho allegato il mio metodo di evidenziazione. Ora funziona perfettamente.

Problemi correlati