2013-03-08 11 views
7

Mam richtextbox na użytkownik może wprowadzić tekst, ale musi być skonfigurowany tak, że jeśli użytkownik przytrzyma klawisz, otrzymują tylko 1 znak.Zezwalaj tylko na jedną wartość na jeden klawisz naciśnij

np. jeśli będą to hold down A, to będzie to tylko wejście A, a nie AAAAAAAAAAAAAAAAAAAAAAAAAAAAA itd.

Od momentu naciśnięcia klawisza do czasu, kiedy klawisz jest podniesiony, chcę, aby był przetłumaczony na 1 wartość.

Jakieś pomysły, w jaki sposób mogę to osiągnąć?

Zgaduję, że muszę użyć KeyDown i KeyUp, ale nie jestem pewien, czy po tym.

Odpowiedz

1

Można podklasy TextBox i zastąpić OnKeyDown i OnKeyUp metod. Jeśli po nie było żadnego KeyUps, zignoruj ​​go, ustawiając KeyEventArgs.SuppresKeyPress na true. Sprawdź kod:

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

Alternatywnie można użyć KeyUp i KeyDown obsługi zdarzeń tak, trzeba pamiętać, że SuppresKeyPress jest kluczowa:

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

Twoje pierwsze rozwiązanie działa idealnie! Dzięki. – user476683

+0

W rzeczywistości oba działają dobrze! – user476683

7

Masz rację co do zdarzeń KeyDown i KeyUp. Możesz to zrobić w ten sposób.

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

Jest to praca dla Delete i Backspace, który jest wielki, ale to nie działa dla kluczy takich jak A, B, C itp? – user476683

+0

@ user476683 Zmodyfikowałem trochę, teraz powinno działać;) – VladL

Powiązane problemy