2013-03-08 13 views
7

Ho un richtextbox su un windows form l'utente può inserire del testo ma deve essere impostato in modo tale che se l'utente tiene premuto un tasto ottiene solo 1 carattere.Permetti solo 1 valore per tasto premere

ad es. se sono allora inserirà solo A e non AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ecc.

Dal momento in cui il tasto è premuto fino al momento in cui la chiave è attiva, voglio solo che traduca in 1 valore.

Qualche idea su come posso raggiungere questo obiettivo?

Suppongo di dover usare KeyDown e KeyUp ma non sono sicuro che sia passato.

risposta

1

Si potrebbe sottoclasse TextBox e sovrascrivere OnKeyDown e OnKeyUp metodi. Se non fosse presente KeyUps dopo KeyDown, ignorarlo impostando KeyEventArgs.SuppresKeyPress a true. Controllare il codice:

public class MyTextBox:TextBox 
{ 
    bool down = false; 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     if (!down) 
      base.OnKeyDown(e); 
     else 
      e.SuppressKeyPress = true; 
     down = true; 
    } 
    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     base.OnKeyUp(e); 
     down = false; 
    } 
} 

In alternativa è possibile utilizzare KeyUp e KeyDown gestori di eventi come questo, si noti che il SuppresKeyPress è fondamentale:

bool down = false; 
private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
     if (down) 
      e.SuppressKeyPress = true; 
     down = true; 
} 

private void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
     down = false; 
} 
+0

La tua prima soluzione funziona perfettamente! Grazie. – user476683

+0

In effetti, entrambi funzionano bene! – user476683

7

Hai ragione sugli eventi KeyDown e KeyUp. Puoi farlo in questo modo.

bool keyDown = false; 
bool keyPress = false; 

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = keyDown; 
    keyDown = true; 
} 

private void richTextBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    keyDown = keyPress = false; 
} 

private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    e.Handled = keyPress; 
    keyPress = true; 
} 
+1

Si tratta di lavorare per cancellare e backspace, che è grande, ma è non funziona per chiavi come A, B, C ecc? – user476683

+0

@ user476683 L'ho modificato un po ', ora dovrebbe funzionare;) – VladL

Problemi correlati