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

 

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

Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

Îåêßíçóå áðü ôï ìÝëïò pstavros. Τελευταία δημοσίευση από το μέλος Markos στις 25-02-2009, 14:47. Υπάρχουν 20 απαντήσεις.
Σελίδα 1 από 2 (21 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-11-2005, 19:09 6829

    Sad [:(] Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Γνωρίζει κανείς πώς μπορώ να μετακινούμαι μεταξύ πεδίων μιας φόρμας με το πλήκτρο Enter κι όχι με το πλήκτρο Tab. Υπάρχει κάποια ρύθμιση στο περιβάλλον, φόρμα ή χρειάζεται κώδικας ; 
    Στ. Παπαδόπουλος
  •  07-11-2005, 19:26 6830 σε απάντηση της 6829

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Κάνεις catch το keypress, αν είναι enter το χαντακώνεις και στέλνεις tab.



      Private Sub TextBox1_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) _
          Handles TextBox1.KeyDown
          If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}")
          If e.KeyCode = Keys.Up Then SendKeys.Send("+{TAB}")
          If e.KeyCode = Keys.Down Then SendKeys.Send("{TAB}")
       End Sub


    Χρήστος Γεωργακόπουλος
  •  07-11-2005, 19:36 6831 σε απάντηση της 6830

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Σ' ευχαριστώ.

    Αυτό πρέπει να γίνεται σε κάθε πεδίο (Textbox) στην φόρμα. Δεν υπάρχει κάτι πιο γενικό. π.χ. για πολλά πεδία σε μία φόρμα.

     

     


    Στ. Παπαδόπουλος
  •  07-11-2005, 19:40 6832 σε απάντηση της 6831

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Μπορείς να φτιάξεις δικά σου controls πχ inherit το textbox και να χρησιμοποιείς αυτά μόνο.
    Ίσως θα ήταν χρήσιμο κάποιο utility που να αλλάζει το enter του αριθμητικού πληκτρολογίου σε tab....
    Χρήστος Γεωργακόπουλος
  •  07-11-2005, 19:48 6833 σε απάντηση της 6832

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Απ' ότι καταλαβαίνεις δεν έχω μεγάλη πείρα σε VB .NET, αλλά αργότερα θα προσπαθήσω να το εφαρμόσω ! (Αφού καταλάβω πως γίνεται).

    Thanks

    Σταύρος Παπαδόπουλος

     


    Στ. Παπαδόπουλος
  •  07-11-2005, 20:58 6837 σε απάντηση της 6831

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

     pstavros wrote:

    Σ' ευχαριστώ.

    Αυτό πρέπει να γίνεται σε κάθε πεδίο (Textbox) στην φόρμα. Δεν υπάρχει κάτι πιο γενικό. π.χ. για πολλά πεδία σε μία φόρμα.

    Για πιο γενικό έχεις δύο λύσεις αλλά είναι κομματάκι πιο σύνθετες από το απλό copy/paste που μπορείς να κάνεις με την παραπάνω λύση.

    Η πρώτη είναι να πιάνεις το event σε επίπεδο φόρμας, δίνοντας στο property "KeyPreview" της φόρμας τιμή True. Κατόπιν, σε ένα handler, μπορείς να γράψεις κώδικα που θα προχωράει στο επόμενο control. Είναι ακριβώς ο κώδικας που σου έδωσε ο Χρήστος μόνο που επειδή θα ισχύει για όλα τα controls θα πρέπει να βρεις έναν τρόπο να εξαιρέσεις αυτά που δεν θες να υπακούουν στον κανόνα Enter=TAB. Αυτό μπορεί να γίνει ελέγχοντας για παράδειγμα το tag property του active control. Έτσι λοιπόν ο προηγούμενος κώδικας γίνεται ως εξής:

        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
            If Me.ActiveControl.Tag <> "Next" Then
                Console.WriteLine(Me.ActiveControl.Name)
                Exit Sub
            End If
            If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}")
            If e.KeyCode = Keys.Up Then SendKeys.Send("+{TAB}")
            If e.KeyCode = Keys.Down Then SendKeys.Send("{TAB}")
        End Sub

    Όμως η πιο κομψή (αλλά και πιο advanced) λύση είναι να προσθέσεις μια ρουτίνα στο Load event της φόρμας (ή στον constructor) η οποία θα κάνει AddHandler statements δηλαδή ουσιαστικά θα προσθέτεις δυναμικά για κάθε control μια KeyDown procedure την οποία θα έχεις προετοιμάσει. Δηλαδή χοντρικά κάτι τέτοιο:

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AddHandlers()
        End Sub

        Private Sub AddHandlers()
            AddHandler TextBox1.KeyDown, AddressOf KeyDownManager
            AddHandler TextBox3.KeyDown, AddressOf KeyDownManager
            AddHandler TextBox4.KeyDown, AddressOf KeyDownManager

            'Εναλλακτικά αυτό για να αποφύγεις να προσθέτεις χειροκίνητα τα controls με
            ' πολλά AddHandler statements
            For Each ctrl As Control In Me.Controls
                If ctrl.Tag = "Next" Then
                    AddHandler ctrl.KeyDown, AddressOf KeyDownManager
                End If
            Next
        End Sub

        Private Sub KeyDownManager(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
            If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}")
            If e.KeyCode = Keys.Up Then SendKeys.Send("+{TAB}")
            If e.KeyCode = Keys.Down Then SendKeys.Send("{TAB}")
        End Sub

    'Μην ξεχάσεις να κάνεις τα αντίστοιχα RemoveHandler στο destructor της φόρμας.

     

     


    Vir prudens non contra ventum mingit
  •  07-11-2005, 20:59 6838 σε απάντηση της 6829

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Ξέχασα... Για το Δημόσιο την φτιάχνεις την εφαρμογή; Big Smile [:D]
    Vir prudens non contra ventum mingit
  •  07-11-2005, 21:34 6847 σε απάντηση της 6838

    Smile [:)] Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Κατ' αρχήν σ' ευχαριστώ που μου ανέλυσες τα παραπάνω. Όσο για το τελευταίο σχόλιό σου; Μετά από πολλά χρόνια εφαρμογών και εκπαιδεύσεων και στον ιδιωτικό τομέα, τα πράγματα είναι πολύ δύσκολα. Εάν δεν κατέβεις στο δικό τους επίπεδο (των χρηστών της εφαρμογής) την έβαψες. Όσο τέλειο κώδικα και να γράφεις (εμείς οι συνάδελφοί σου να τον θαυμάζουμε), αυτοί σου βγάζουν την εφαρμογή, άχρηστη. Πολλές φορές φτάνουμε σε σημείο να τους κάνουμε όλη την παραμετροποίηση οι ίδιοι μας. (παραμετρική εφαρμογή κατά τ' άλλα).

    Χίλιες φορές να γράφεις κώδικα και να ασχολείσαι με την δημιουργία της εφαρμογής και την τεχνολογία, παρά να εκπαιδεύεις και να υλοποιείς.
    Και δείξε μου κάποιον προγραμματιστή που δεν είναι φιλότιμος !

    Σταύρος

    Στ. Παπαδόπουλος
  •  07-11-2005, 22:56 6850 σε απάντηση της 6838

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

     KelMan wrote:
    Ξέχασα... Για το Δημόσιο την φτιάχνεις την εφαρμογή; Big Smile [:D]

    Υπάρχουν περιπτώσεις που η θέση του κουμπιού Enter στο αριθμητικό πληκτρολόγιο, είναι ικανή να γλυτώσει A λεπτά την ημέρα από το dataentry κάθε μίας από τις B κοπέλες που πληρώνεται Γ ευρώ το λεπτό. Και επειδή σε κάποιες περιπτώσεις το Α και το Β και το Γ έχουν μεγάλες τιμές, η εταιρία γλυτώνει Α*Β*Γ*20*12 ευρώ ανά έτος. Όταν αυτό το νουμεράκι αρχίζει να έχει πάνω από 5 ψηφία, κάποιος χαρτογιακάς κάθεται πάνω από τις κοπέλες και χρονομετράει πόση ώρα κάνει στο dataentry. Ε, σε τέτοιες περιπτώσεις, αξίζει να φας πολλές ώρες για να στέλνεις tab στη θέση του enter... :-)


    Χρήστος Γεωργακόπουλος
  •  07-11-2005, 23:21 6853 σε απάντηση της 6850

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Χμμμ... Γ €/min! Πάω για dummy data entry! Big Smile [:D]

    Χε χε... Αυτό το σχόλιο το έκανα γιατί στις εκπαιδεύσεις αυτό είναι κλασικό ζητούμενο και μου το ρωτάνε COBOLάδες και CLIPPERάδες...
    Vir prudens non contra ventum mingit
  •  08-11-2005, 09:14 6869 σε απάντηση της 6853

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Μην το γελάτε αυτό! Εχω δουλέψει ως πιτσιρικάς σε data entry (και η πλάκα ήταν οτι σε μια από τις δύο περιπτώσεις είχα φτιάξει και την εφαρμογή data entry) :) Πραγματικά, το Enter αποδείχθηκε σωτήριο (ειναι πιό μεγάλο και πιό "βαρύ" από το tab και οι κοπελίτσες και οι μαντράχαλοι που πληκτρολογούσαν μανιασμένα του έδιναν και καταλάβαινε - πληρωνόμασταν με το κομμάτι, οπότε είχε σημασία).

    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  07-12-2005, 13:28 7609 σε απάντηση της 6830

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

     cgeo wrote:

    Κάνεις catch το keypress, αν είναι enter το χαντακώνεις και στέλνεις tab.



      Private Sub TextBox1_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) _
          Handles TextBox1.KeyDown
          If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}")
          If e.KeyCode = Keys.Up Then SendKeys.Send("+{TAB}")
          If e.KeyCode = Keys.Down Then SendKeys.Send("{TAB}")
       End Sub



    Εάν το θες για πολλά textboxes μπορείς επίσης απλά να προσθέσεις στο handles τα keydown events και των άλλων textboxes, δηλαδή η δήλωση να γίνει


      Private Sub TextBox1_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) _
          Handles TextBox1.KeyDown, TextBox2.Keydown, TextBox3.Keydown, TextBox4.Keydown



    Panos
  •  07-12-2005, 14:13 7615 σε απάντηση της 6829

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Δέν είναι πολύ καλή λύση αυτή καθώς φαντάσου να έχει 200 textboxes στην εφαρμογή του (όπως εγώ)..Θα πεθάνει να γράφει..ασε που control δεν θεωρείτε μόνο textbox..Αλλά και button και GroupBox κλπ κλπ.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  07-12-2005, 15:17 7618 σε απάντηση της 7615

    Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    Για μια γενικότερη λύση, μπορείτε να δείτε λίγο την ProcessCmdKey.

    Αυτή είναι μια method που καλείται ΚΑΙ στο επίπεδο της φόρμας και η οποία μπορεί να γίνει override (δυστυχώς το keydown στη φόρμα δεν δουλεύει - για κάποιον λόγο που δεν έχω κατανοήσει), οπότε χρησιμοποιησα την ProcessCmdKey ως εξής:

        'Αυτή η method τρέχει σε κάθε control αλλά και στο επίπεδο της
        'φόρμας. Την κάνουμε override για να χειριστούμε μόνοι μας το
        'πλήκτρο που πατήθηκε.
        Protected Overrides Function ProcessCmdKey( _
              ByRef msg As System.Windows.Forms.Message _
            , ByVal keyData As System.Windows.Forms.Keys _
            ) As Boolean

            'Αν βρούμε οτι ο χρήστης πάτησε Enter
            If msg.WParam.ToInt32() = CInt(Keys.Enter) Then

                'Επιλέγουμε το επόμενο control με βάση το tabindex και με wrapping ωστε να ξαναπάμε
                'στο πρώτο control αν βρισκόμαστε στο τελευταίο.
                Me.SelectNextControl(Me.ActiveControl(), True, True, True, True)

                'Επιστρέφουμε true για να δείξουμε οτι χειριστήκαμε το event.
                Return True

            Else

                'Αν ο χρήστης δεν πάτησε το πλήκτρο που θέλουμε, χειριζόμαστε κανονικά
                'τη base function
                Return MyBase.ProcessCmdKey(msg, keyData)

            End If

        End Function

    Το δοκίμασα και παίζει μια χαρά. Αν μπορεί κάποιος βέβαια να μας εξηγήσει γιατί δεν παίζει το keydown στη φόρμα...

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  07-12-2005, 15:29 7621 σε απάντηση της 7609

    Confused [*-)] Απ: Μετακίνηση σε φόρμα VB με Enter κι όχι με Tab !

    An δεν θες να συνδέεις controls me handlers μπορείς να φτιάξεις για τα controls pou επιθυμείς να έχουν αυτή τη συμπεριφορά αντίστοιχα δικά soy στα οποία θα κάνεις Override το Function ProcessCmdKey

    p.x

    Public Class MyTextbox 
       Inherits Textbox

    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean 

       If msg.WParam.ToInt32() = CInt(Keys.Enter) Then 

          SendKeys.Send("{Tab}") 

          Return True 

       End If 

       Return MyBase.ProcessCmdKey(msg, keyData)

    End Function 'ProcessCmdKey


    End Class 'MyTextbox


    public class MyTextbox : Textbox


       protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)


       if(msg.WParam.ToInt32() == (int) Keys.Enter) 
          { 
          SendKeys.Send("{Tab}"); 
          return true; 
          } 
       return base.ProcessCmdKey(ref msg, keyData);
    }

    }


    Y.Γ. To post egine σχεδόν ταυτόχρονα με το προηγούμενο του φίλου Kap και το οποίο παρουσιάζει έναν άλλο πιο elegant τρόπο να λύσεις το πρόβλημά σου.

Σελίδα 1 από 2 (21 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems