Παιδιά, φοβάμαι ότι μπλέξατε γλώσσες και handlers και το πράγμα έγινε λίγο περίεργο
gtas, ο EventHandler που έγραψες είναι το λιγότερο περίεργος και μάλλον θα σε οδηγήσει σε out of memory exception αν τρέξει για πολύ. Έχεις δύο event handlers και λες στον πρώτο να προσθέσει και το δεύτερο event handler στη λίστα. Αυτό σημαίνει ότι μόνο ΑΦΟΥ ο χρήστης γράψει το δεύτερο χαρακτήρα μέσα στο textbox θα αρχίσει να δουλεύει ο δεύτερος event handler. Επίσης σημαίνει ότι ΚΑΘΕ φορά που ο χρήστης πατάει ένα κουμπί, εσύ θα προσθέτεις άλλο ένα event handler για το KeyPress.
Αν θέλεις να χρησιμοποιήσεις τη μέθοδο Keycheck ως event handler, γράφτο κατευθείαν και ξέχνα την textbox1_KeyPress. Ή βάλε τον κώδικα στην textBox1_Keypress. Όχι όμως αυτό που κάνεις.
infoCenter, ο κώδικας που γράφεις είναι για VB6. Σε .NET δεν παίζει και όποιος δεν ξέρει VB6 δεν θα βγάλει άκρη.
gtas, το ότι εξαφανίζεται το κείμενο από το textbox1 μπορεί να συμβεί μόνο αν το textbox1 είναι multiline αλλά το έχεις μικρύνει τόσο ώστε να φαίνεται μόνο η μία γραμμή. Ακόμα όμως και αν το κάνεις single line, κάθε φορά που ο χρήστης πατάει το Enter θα ακούει ένα ding γιατί ο χαρακτήρας Enter κανονικά δεν επιτρέπεται σε single line textbox.
Ο κώδικας που χρειάζεται είναι ο παρακάτω:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter || e.KeyCode==Keys.Return)
{
e.SuppressKeyPress = true;
this.GetNextControl((Control)sender, true).Focus();
}
}
Καταρχήν, χρησιμοποιούμε την KeyDown γιατί εκεί μπορούμε και να ελέγξουμε ποιό κουμπί πατήθηκε, αλλά και να το εμποδίσουμε. Όταν φτάνουμε στην KeyPress είναι πλέον αργά και μπορούμε μόνο να δούμε ποιός ήταν ο χαρακτήρας.
Μετά, πρωτού καλέσουμε την GetNextControl θέτουμε την τιμή SuppressKeyPress. Έτσι ουσιαστικά "τρώμε" το Enter και δεν πρόκειται ούτε ding να ακουστεί ούτε να μπει ο χαρακτήρας στο multiline textbox
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos