2013-04-24 7 views
42

sto facendo la domanda già chiesto (e anche risposto) qui: Why are some textboxes not accepting Control + A shortcut to select all by defaultCome posso consentire ctrl + a con TextBox in winform?

Ma questa risposta non funziona per me. Ho questo codice:

public class LoginForm : Form 
{ 
    private TextBox tbUsername; 

    public LoginForm() 
    { 
     tbUsername = new TextBox(); 
     tbUsername.ShortcutsEnabled = true; 
     tbUsername.Multiline = false; 
     Controls.Add(tbUsername); 
    } 
} 

La casella di testo si presenta, posso scrivere su di esso, posso tagliare, copiare e incollare il testo su di esso senza alcun problema. Ma quando provo a premere Ctrl + A Ho solo sentito un "bling" simile al bling che senti se provi a cancellare il testo da una casella di testo vuota (provalo con la barra degli indirizzi del browser).

+0

FWIW il tuo codice funziona per me. Posso usare 'CTRL + A' e altre scorciatoie. Pensavo che "shift + freccia su" avrebbe dovuto selezionare una lettera alla volta. 'shift and end' seleziona tutto. – keyboardP

+0

sì, funziona anche io ... quale versione di .net stai usando? – spajce

+0

@spajce Non sono sicuro, dove posso verificarlo? –

risposta

58

Come altre risposte indicano, Application.EnableVisualStyles() dovrebbe essere chiamato. Anche TextBox.ShortcutsEnabled deve essere impostato su true. Ma se il vostro TextBox.Multiline è abilitato alloraCtrl +Unnon funzionerà (see MSDN documentation). L'utilizzo di RichTextBox invece risolverà il problema.

+1

La migliore risposta esplicativa, in particolare sulla parte riguardante Multiline. Altre risposte non sono mai state toccate affatto. +1 – Kaitlyn

+11

La parte relativa a MultiLine deve parlare del comportamento predefinito. Mettendo 'if (e.Control && e.KeyCode == Keys.A) Textbox.SelectAll();' nel gestore di eventi KeyDown funziona perfettamente per me. – Dan

+2

@Dan corretto, devi lavorare su di esso in quel modo se stai usando MultiLine e hai ancora bisogno di una casella di testo standard. Una decisione di design strana (leggi come: bug) di MS. – jltrem

24

Si può sempre ignorare i tasti di comando processo per ottenere il risultato desiderato

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    const int WM_KEYDOWN = 0x100; 
    var keyCode = (Keys) (msg.WParam.ToInt32() & 
          Convert.ToInt32(Keys.KeyCode)); 
    if ((msg.Msg == WM_KEYDOWN && keyCode == Keys.A) 
     && (ModifierKeys == Keys.Control) 
     && tbUsername.Focused) 
    { 
     tbUsername.SelectAll(); 
     return true; 
    }    
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+2

Questa è la soluzione rapida e sporca per tutti quelli in cui "Application.EnableVisualStyles();" non è applicabile. Molto utile per me. Grazie. – Lars

+0

Se si desidera che funzioni anche se il controllo TextBox non è attivo, rimuovere il codice "&& tbUsername.Focused" e aggiungere questa istruzione dopo la chiamata .SelectAll(): "tbUsername.Focus();". Vedi qui: http://stackoverflow.com/questions/18050714/how-can-i-select-all-the-text-within-a-windows-forms-textbox – RenniePet

3

Questo è accaduto a me una volta di troppo, sto assumendo è stato rimosso il bando di Application.EnableVisualStyles(); dal vostro programma? Aggiungilo alla funzione Main() e tutto dovrebbe funzionare correttamente.

+0

Grazie a ciò è stato risolto. C'è un modo per farlo solo per un modulo, quindi mi piacerebbe 'MyForm.EnableVisualStyles();'? –

+8

Non sono sicuro che questa sia la risposta corretta, poiché il mio progetto ha aggiunto questa riga in Main e CTRL + A non funziona. Wierd ... –

+0

Allo stesso modo - non funziona per me - Application.EnableVisualStyles() è presente e Ctrl + A non funziona, Ctrl + C è .... strano. – Morvael

0

Non è necessario gestire WM_KEYDOWN! So che la maggior parte degli esempi qui (e CodeProject e molti altri posti) dicono tutti che esiste, ma non cura il segnale acustico che risulta ogni volta che si verifica un WM_CHAR che non viene gestito.

Invece, provate questo:

LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ 
    if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;} 
    else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam); 
} 

Ricordarsi di sottoclasse il controllo EDIT per questo Edit_Prc() utilizzando WPA = SetWindowLong (...) in cui WPA è l'indirizzo di procedura finestra per CallWindowProc (...)

L'ho capito per esperimento, dopo aver scoperto che tutte le risposte che ho trovato online hanno insistito sulla gestione di WM_KEYDOWN, utilizzando GetKeyState(), e sono finite con un codice più grande che non è riuscito a fermare quel fastidioso segnale acustico!

Mentre questa risposta non ha a che fare con dotnet, in casi come questo di solito è meglio andare al sodo e risolverlo piuttosto che agonizzare su quale versione di un grande sistema di wrapper del codice può o non può farlo per te, soprattutto se si vuole evitare il rischio di lottare contro comportamenti insiti.

1

La casella di testo ha un metodo SelectAll() e ha funzionato bene per me. (.net 4,5)

26

Basta creare un evento KeyDown per quella TextBox in questione e comprendono questo codice:

private void tbUsername_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.A) 
    { 
     if (sender != null) 
      ((TextBox)sender).SelectAll(); 
    } 
} 
+0

Questa soluzione è molto buona se si dispone di Application.EnableVisualStyles() nel codice ma CTRL + A continua a non funzionare. – NeverStopLearning

3

La risposta rapida è che se si utilizza multilinea true, è necessario chiamare esplicitamente il select all.

private void tbUsername_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.A && e.Control) 
    { 
     tbUsername.SelectAll(); 
    } 
} 
0

Lancio nei miei due centesimi. Chiamarlo sotto il tasto di pressione è solo un'altra opzione.

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == '\x1') 
    { 
     TxtBox.SelectAll(); 
     e.Handled = true; 
    } 
} 
Problemi correlati