Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

TextBox Focus...

Îåêßíçóå áðü ôï ìÝëïò Τάσκος Γιώργος. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 12-10-2008, 23:27. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-10-2008, 23:30 45382

    TextBox Focus...

    Σε μία φόρμα έχω μερικά textboxes.

    Θέλω πατώντας ENTER ή TAB από ένα textbox να πηγαίνει σε κάποιο άλλο textbox.
    το κατάφερα με..

    private void textbox1_KeyPress(object sender, KeyPressEventArgs e)
    {
    this.textbox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(KeyCheck);
    }

    private void KeyCheck(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
    if (e.KeyChar == (char)13)
    {
    textbox2.Select();
    textbox2.SelectAll();
    }
    }


    Υποτίθεται ότι με το '+=' θα έπρεπε να κρατάει την τιμή που έχεις γράψει στο textbox1,
    δεν παίζει φάση όμως. Από την άλλη με αυτόν τον τρόπο, πρέπει για κάθε textbox να γίνει
    ένας handlerν υπάρχει κάποιος άλλος τρόπος, φαντάζομαι αν υπήρχε π.χ. κάτι που δεν βλέπω?.
    Επίσης με το ENTER event κάνει πάλι το ίδιο αλλά γλιτώνεις λίγο γράψιμο.
    Η ερώτηση όμως είναι γιατί μου σβήνει την τιμή από το textbox που ήταν? ποιο property
    ή event μου διαφεύγει?

  •  12-10-2008, 08:14 45386 σε απάντηση της 45382

    Απ: TextBox Focus...

    Γεια σου,

    Θα απαντήσω στο αρχικό ερώτημα για το πως αλλάζουμε control με Enter.

    Λύση 1.

    Στο Form_KeyDown event της φόρμας γράφεις

    If KeyCode = vbKeyReturn Then
        SendKeys "{TAB}"
    End If

    Νομίζω είναι απλό, καταλαβαίνεις ότι αντί για Enter περνάμε το Tab

    Λύση 2.

    Χρησιμοποίησε την GetNextControl.

    Αν και 99,5% των περιπτώσεων όποια από τις δύο και αν διαλέξεις θα κάνουν την ίδια δουλειά, το 100% όμως θα το έχεις με την δεύτερη.

  •  12-10-2008, 14:11 45395 σε απάντηση της 45386

    Απ: TextBox Focus...

    Χθές ανακάλυψα το Peoperty TabIndex και πατωντας TAB το έκανα να πηγαίνει με την σειρά που θέλω,
    και δουλεύει όπως θέλω. Προσθέτωντας παράλληλα και την λύση 1, παίζει επίσης το ότι πηγαίνει στο επόμενο,
    ΑΛΛΑ σβήνεται πάλι αν γράψεις κάτι στο textbox! Είδα τι κάνει η GetControlNext, και βασίζεται
    στο tabindex, δεν την δοκίμασα όμως.....


  •  12-10-2008, 17:21 45400 σε απάντηση της 45395

    Απ: TextBox Focus...

    Γεια σου.

    Δεν γνωρίζω για πιο λόγο διαγράφει ότι έχει γραφεί μέσα στο TextBox. Άλλωστε το thread έχει θέμα να αλλάζεις control και πανω σε αυτό επικeντρωθήκαμε. Όμως...

    Δοκιμάζοντας δύο διαφορετικές λύσης η μία με event handler (δική σου επιλογή) και η άλλη με το SendKeys σημαίνει πως κάτι στον κώδικά σου που έχεις γράψει είναι λάθος.

    Δώσε μας λίγο κώδικα να δούμε...

  •  12-10-2008, 18:27 45406 σε απάντηση της 45400

    Απ: TextBox Focus...

    Δεν μπορώ να φανταστώ τι κώδικα να σου κάνω Paste, αφού δεν κάνω κάτι ιδιαίτερο πάνω στα textboxes,
    αυτο το πρόβλημα γινόταν απο την αρχή που τα έκανα add πάνω στην φόρμα μου, (εξού και η δημοσίευση)
    και εκτός το ότι διαβάζω το Text property τους και τον handler, και το SendKeys, δεν έχω κάτι άλλο που να τα αφορά.

  •  12-10-2008, 21:07 45414 σε απάντηση της 45406

    Απ: TextBox Focus...

    Παιδιά, φοβάμαι ότι μπλέξατε γλώσσες και 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
  •  12-10-2008, 21:51 45415 σε απάντηση της 45414

    Απ: TextBox Focus...

    Για την ακρίβεια υπάρχει και στο .NET Framework SendKeys (System.Windows.Forms.SendKeys), αλλά με διαφορετική σύνταξη:

     SendKeys.Send("{ΤΑΒ}")


    Vir prudens non contra ventum mingit
  •  12-10-2008, 22:07 45416 σε απάντηση της 45415

    Απ: TextBox Focus...

    Παναγιώτη χρησιμοποίησα μόνο το Sendkeys.Send() τελικά, δεν θα άφηνα και τους δύο handlers πάνω...
    μου φάνηκε λογικό να έχω ένα handler και όχι δύο για ίδιο έλεγχο.

    Τα έκανα με την μέθοδο του παναγιώτη εφόσον τα άλλαξα σε [EDITED] singleline και παίζει....

    Ευχαριστώ, και πάλι.



  •  12-10-2008, 23:27 45419 σε απάντηση της 45415

    Απ: TextBox Focus...

    Για την ακρίβεια με πείραξε το If KeyCode = vbKeyReturn και όχι το SendKeys. Βλέπω πάντως στο documentation ότι για να δουλέψει η SendKeys σε Vista πρέπει να χρησιμοποιηθεί .NET 3.0. Κι έχει και κάποια προβληματάκια με το timing τα οποία μειώθηκαν αλλά δεν εξαφανίστηκαν στο .NET 3.0
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems