Προσθήκη run-time γεγονότα (addHandler)

Θέλω να δείξω πολλά πράγματα με αυτό το παράδειγμα ... αλλά ο κυριότερος είναι πώς μπορείτε να προσθέσετε τα γεγονότα σε μια ομάδα των ελέγχων κατά το χρόνο εκτέλεσης της Visual Basic. Net.

Για παράδειγμα, χρειαζόμαστε μια φόρμα με πολλούς ελέγχους textbox του (ανεξάρτητα από το πώς ονομάζονται). Μπορείτε να κάνετε κάτι σαν αυτό που έκανα.

Κάθε φορά που ο σχεδιαστής του στούντιο σας δώσει οπτική διπλό κλικ σε ένα στοιχείο ελέγχου έχει δημιουργηθεί ένα υπο ρουτίνα που θα είναι υπεύθυνη για τη διαχείριση της εκδήλωσης. Σε περίπτωση αδυναμίας πλαίσιο κειμένου στο TextChanged εκδήλωση και την οπτική στούντιο σχεδιαστής θα δημιουργήσει μια υπορουτίνα που ονομάζεται TextBox1_TextChanged αλλά στην πραγματικότητα το όνομα δεν έχει σημασία, θα μπορούσαμε να το αλλάξει και τίποτα δεν θα συμβεί. Το σημαντικό πράγμα είναι αυτό που βρίσκεται στο τέλος της γραμμής: "handles TextBox1.TextChanged". Αυτό δείχνει ότι η συστηματική «διαχείριση» του TextBox1.TextChanged εκδήλωση.

Μπορούμε να παραχωρήσει αυτούς τους "διαχειριστές" κατά το χρόνο εκτέλεσης και, όπως σε αυτό το παράδειγμα, μπορούμε να το κάνουμε με την ίδια λειτουργία για πολλαπλούς ελέγχους.

Η σύνταξη για να εισάγετε ένα άλλο handler είναι:

 AddHandler Objeto.Evento, AddressOf MiRutina

και αφαιρέστε το χειριστή:

 RemoveHandler Objeto.Evento, AddressOf MiRutina

Veramos τώρα το παράδειγμα στην ερώτηση: σε αυτό το παράδειγμα είναι ό, τι Arem προσθέσει δύο εκδηλώσεις για τον έλεγχο κάθε κουτάκι που έχουμε στη φόρμα. Οι εκδηλώσεις αυτές θα GotFocus (το οποίο εμφανίζεται όταν ο έλεγχος γίνεται εστίαση) και LostFocus (το οποίο εμφανίζεται όταν χάνει τον έλεγχο εστίαση). Όταν ο έλεγχος έχει εστίαση είναι να αλλάξετε το χρώμα του φόντου, στην περίπτωση αυτή, ένα κίτρινο. Και όταν χάνεις θα επιστρέψει στο κανονικό χρώμα.
Το πρώτο πράγμα είναι να προσθέσετε Arem Αυτές οι δύο κινήσεις.

 ConFoco Private Sub (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs)
     DirectCast (αποστολέα, TextBox). BackColor = Color.Yellow
 Sub End

 SinFoco Private Sub (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs)
     DirectCast (αποστολέα, TextBox). BackColor = Color.White
 Sub End

Συνήθως, έχουμε τις δύο κινήσεις, αλλά ακόμα ... κανείς δεν τους ζητά. Γι 'αυτό πρέπει να προσθέσουμε σε κάθε κουτάκι ελέγχου στη φόρμα για να καλέσετε μια συνάρτηση handler ΘΕΣ.

Σε περίπτωση φόρτωσης της φόρμας προσθέστε τον ακόλουθο κώδικα:

 Για κάθε γ Όπως Αντικείμενο Στο Me.Controls
     Αν c.GetType Είναι gettype (TextBox) Στη συνέχεια,
         AddHandler DirectCast (γ, TextBox). GotFocus, AddressOf conFoco
         AddHandler DirectCast (γ, TextBox). LostFocus, AddressOf sinFoco
     End If
 Επόμενη

Και Presto, μπορούμε να ελέγξουμε το πρόγραμμα και δεν χρειάζεται τίποτα άλλο. Όλα textbox αλλάξετε το χρώμα φόντου σας για να λάβει την εστίαση. Δεν έχει σημασία πόσοι είναι ή ό, τι είστε ονομάζεται.

στην παρακάτω εικόνα είναι η μορφή σε λειτουργία:

Νομίζω ότι αξίζει να εξηγήσει λίγο την τελευταία κωδικό.
Για κάθε τρέχει σε όλα τα

36 απαντήσεις σε "Προσθήκη run-time γεγονότα (addHandler)"

  1. Bitacoras.com λέει:

    Πληροφορίες Bitacoras.com ...

    Τιμή στο Bitacoras.com: Θέλω να δείξω πολλά πράγματα με αυτό το παράδειγμα; αλλά ο κυριότερος είναι πώς μπορείτε να προσθέσετε τα γεγονότα σε μια ομάδα των ελέγχων κατά το χρόνο εκτέλεσης της Visual Basic. καθαρά. Για παράδειγμα, χρειαζόμαστε μια φόρμα με πολλούς ελέγχους ....

  2. Jose Antonio λέει:

    Σας ευχαριστούμε! Κωδικός καθαρό, απλό και λειτουργικό. Είσαι ένα φαινόμενο. Θα χρησιμοποιηθεί για πίνακες ελέγχου σε VB6 για αυτά τα πράγματα (όπως Miss ...), αλλά με αυτό το μικρό τέχνασμα είναι κομψά λυθεί.

  3. Eduardo Hernandez Saenz λέει:

    Ευχαριστώ για αυτήν την εξαιρετική συμβολή, έχω αναπτύξει σε VB6 για 8 χρόνια και δεν είχε βρει έναν τρόπο να κάνουμε. Net, το οποίο έκανε σε VB6 με συστοιχία των ελέγχων, όπως γράφει ένα απλό γεγονός για κάθε μορφή TexBox και τον εντοπισμό ενός κάθε κατά Δείκτη. Με την υποστήριξή σας gan ξεπέρασε αυτή τη δυσκολία. ΕΥΧΑΡΙΣΤΩ

  4. Fernando λέει:

    Γεια σας, πολύ καλή εξήγηση. Η addHandler Νομίζω ότι ένα ενδιαφέρον εργαλείο, αλλά έχω μια ερώτηση σχετικά με αυτό. Το χρησιμοποιώ σε asp.net και λειτουργεί μεγάλο, μπορώ να προσθέσω τα γεγονότα να συνδέει δυναμικά είδος, αλλά λειτουργεί μόνο αν η addHandler είναι το φορτίο. Υπάρχει κάποιος τρόπος που λειτουργεί δεν είναι το φορτίο εκεί;
    Ευχαριστώ για όλα

  5. Χοσέ λέει:

    σούπερ καλή αυτός ο κώδικας σώζει πολλές γραμμές, και του χρόνου.

  6. Χοσέ λέει:

    Μπορείτε να κάνετε κάτι παρόμοιο αλλά και να επικυρώσει το πάτημα μόνο με αριθμούς, κλπ., αλλά κατά κάποιον τρόπο τον εντοπισμό κάθε κουτάκι να γνωρίζουμε ποιος να εφαρμόσετε μορφοποίηση ή που πρέπει να είναι μόνο αριθμοί, κείμενο, κλπ.. Ελπίζω να γίνει το σημείο σας.

  7. Facundo, δήλωσε:

    Γεια σας, μου αρέσει το site σας και να θαυμάσετε την αφοσίωσή σας στο αξίωμα. Είμαι σήμερα φοιτούν στο πανεπιστήμιο και βοηθάει.

    Χαιρετίσματα!

  8. Shocksue λέει:

    Γεια σας καλό κώδικα, αλλά είμαι μια άλλη εφαρμογή για τον έλεγχο και την άλλη περίπτωση, και όταν συμβαίνει ότι όταν λέω:
    AddHandler miObjeto.evento, AddressOf miRutina
    μου λέει ότι η μέθοδος «mirutina" έχει την ίδια υπογραφή με τον εκπρόσωπο.
    Στο παράδειγμά σας, δεν μπορείτε να στείλετε τον παραμέτρους του εκπροσώπου και την εργασία για σας, που μπορεί να μου συμβαίνει;
    Σας ευχαριστούμε εκ των προτέρων για τη βοήθειά σας ..

    • Ελισσαιέ λέει:

      Είναι αλήθεια, στέλνω τις παραμέτρους γιατί πρέπει να στείλει οτιδήποτε (από την αποστολή για τον έλεγχο που προκάλεσε την εκδήλωση), αλλά πρέπει να ορίζεται στην πρόσκληση διαδικασία. Για παράδειγμα: Private Sub MiRutina (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs).

      Τύχη

  9. PreguntadorVB λέει:

    Γεια σου, αυτό είναι ένα καλό παράδειγμα της χρήσης των AddHandler και προστίθενται στοιχεία ελέγχου στη φόρμα.

    Γι 'αυτό θέλω να συμβάλει λίγο μου με την προσθήκη ενός κώδικα για να προσθέσετε συμβάντα σε ελέγχους δημιουργήθηκε κατά το χρόνο εκτέλεσης.

    Ένα χαιρετισμό.

    ----------------

    PulsadoDobleClick Private Sub (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs)
    MsgBox ("Πατήσατε διπλό κλικ")
    Sub End

    Private Sub Form1_Load (ByVal αποστολέα Όπως System.Object, ByVal e Όσον System.EventArgs) Λαβές MyBase.Load
    Όπως Νέα κειμένουΈλεγχος Δημ. MiCajaDeTexto ()
    MiCajaDeTexto.Name = "CajaDeTexto"
    Me.Controls.Add (MiCajaDeTexto)
    Me.Controls AddHandler (MiCajaDeTexto.Name). DoubleClick, AddressOf Me.PulsadoDobleClick
    Sub End

  10. Fernando λέει:

    Ευχαριστώ για τη βοήθειά σας, έφερα από το πρόβλημα. Κατάγομαι από VB6 και είναι πολύ διαφορετική, διάβασα κάπου ότι η Microsoft σκοπεύει να συμπεριλάβει νέες συστοιχίες των ελέγχων σε νέες εκδόσεις τους VB.NET με τον ίδιο τρόπο που διεξήχθησαν σε VB6. Αυτό θα καταστήσει τη ζωή ευκολότερη για όσους από εμάς της παλιάς VB6.

  11. Alejandro Contreras λέει:

    Εξαιρετική, μπορώ να προσθέσω μόνο ένα σχόλιο σχετικά με τη δυνατότητα της ανάθεσης μιας λειτουργίας που έχει παραμέτρους.

  12. Wilden λέει:

    Μεγάλη ρουτίνα, μεγάλη βοήθεια για εκείνους που εξακολουθούν να μεταναστεύουν από την VB6. Net, Χάρη
    »** Χρησιμοποιήστε το μόνο για ανάγνωση ιδιότητα να επεξεργαστείτε το πλαίσιο κειμένου σε μια δεδομένη GroupBox **"

    Παράδειγμα στο έργο μου:

    Private Sub Form1_Load (ByVal αποστολέα Όπως System.Object, ByVal e Όσον System.EventArgs) Λαβές MyBase.Load

    «Βρείτε το σε ένα κουτάκι GroupBox
    Για κάθε γ Όπως Ελέγχου Σε Me.grpDatosPasajero.Controls

    Αν c.GetType Είναι gettype (TextBox) Στη συνέχεια,

    AddHandler DirectCast (γ, TextBox). Εισάγετε, AddressOf conFoco
    AddHandler DirectCast (γ, TextBox). Αφήστε, AddressOf sinFoco

    End If

    Επόμενη

    Sub End

    «Ρουτίνες
    ConFoco Private Sub (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs)

    Αν όχι DirectCast (αποστολέα, TextBox). Τότε μόνο για ανάγνωση

    DirectCast (αποστολέα, TextBox). BackColor = Color.PaleGoldenrod
    End If

    Sub End

    SinFoco Private Sub (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs)

    Αν όχι DirectCast (αποστολέα, TextBox). Τότε μόνο για ανάγνωση
    DirectCast (αποστολέα, TextBox). BackColor = Color.White
    End If

    Sub End

    wav

  13. Vb Mik λέει:

    Exelentes κωδικούς φίλους jejej οφείλω να ομολογήσω. garacias σε εύθετο χρόνο. Χαιρετίσματα σε όλους

  14. Ale λέει:

    Συμμερίζομαι αυτόν τον κώδικα στο relize με τη βοήθεια των σημειώσεων του, αυτό θα με βοηθήσει να δημιουργήσει όλες τις κουμπιά που χρειάζεστε και να το στείλετε για μια συνάρτηση με τους όρους που συνδέονται με το κουμπί πατημένο, το φως από ένα μεμονωμένο γεγονός

    Δημόσια τάξη Φόρμα1
    Δημ. lbls () Όπως Κουμπί
    Private Sub Form1_Load (ByVal αποστολέα Όπως System.Object, ByVal e Όσον System.EventArgs) Λαβές MyBase.Load
    Δημ. τοπ As Integer = 25
    Για m As Integer = 0 έως 4
    Διατήρηση ReDim lbls (m)
    lbls (m) = Κουμπί Νέα
    Με lbls (m)
    . Κείμενο = ("Κουμπί" & M)
    . Περιοχή = Νέο σημείο (0, LOC)
    . Μέγεθος () = Νέα System.Drawing.Size (75, 23)
    Με το τέλος
    lbls (μ). Όνομα = m
    Me.Controls.Add (lbls (μ))
    Me.Controls AddHandler (lbls (μ). Όνομα). Κάντε κλικ, AddressOf Me.Click
    loc = 25 +
    Επόμενη
    Sub End

    Private Sub Κάντε κλικ (ByVal αποστολέα Ως αντικείμενο, ByVal e Όσον System.EventArgs)
    Δημ. ι Όπως Κουμπί = αποστολέα
    MsgBox ("Θα πατήσει το κουμπί" & j.Name)
    Sub End
    Τέλος κατηγορίας

    Ελπίζω και θα είναι κάποια

  15. Χούλιο Λόπες λέει:

    Θέλω να δημιουργήσω μια TabPage και μέσα σε αυτό ένα datagridview κατά το χρόνο εκτέλεσης, και q επίσης να προσθέσετε αυτούς τους ελέγχους σε χρόνο σχεδίασης, αν κάποιος ξέρει πώς να το κάνουμε, εκτιμώ τη βοήθειά σας.

  16. Χούλιο Λόπες λέει:

    Θέλω να δημιουργήσω μια TabPage και μέσα σε αυτό ένα datagridview κατά το χρόνο εκτέλεσης, και επίσης να προσθέσω αυτά τα στοιχεία ελέγχου στην οθόνη basic.net σχεδιασμό οπτική, αν κάποιος ξέρει πώς να το κάνουμε, εκτιμώ τη βοήθειά σας.

  17. pepelepu λέει:

    Holas! ο καθένας! αυτό που συμβαίνει εδώ είναι ότι η ιδιοκτησία να δοθεί σε όλα κειμένου με:
    Για κάθε γ Όπως Αντικείμενο Στο Me.Controls
    αλλά αν kiero δώσει εξαιρέσεις σε ορισμένους ελέγχους, όπως κάνω ... για παράδειγμα, με ένα κουμπί kiero συμπληρώστε την φόρμα μου με λίγα txtbox σημειώσεις για τους φοιτητές, αλλά υπάρχουν και άλλες, όπως txtbox κώδικα, αναφέρουμε τις σημειώσεις μετά από κατά μέσο όρο kiero utlizo
    Dim Sum (ιδ) As Double
    Γ Δημ. Όπως Ελέγχου
    Για κάθε γ Σε Me.Controls
    Αν typeof γ Είναι κειμένουΈλεγχος συνέχεια
    Άθροισμα (Val (c.Tag)) + = Val (c.Text)
    End If
    Επόμενη
    Για κάθε γ Σε Me.Controls
    Dim i As Integer
    Αν typeof c είναι ετικέτα,
    Αν c.Tag> = 0, τότε
    Αν Val (c.Tag) = θ συνέχεια
    c.Text = Sum (Ι) / Val (txtnn.Text)
    i + = 1
    End If
    End If
    End If
    αλλά παίρνω όλα και ο μέσος όρος txtbox πάει στραβά

  18. mekano λέει:

    pepelepu, δοκιμάστε exluir όπως αυτό:

    ...
    Για κάθε γ Σε Me.Controls
    επιλέξτε c.Name περίπτωση
    «Ελέγχους ώστε να αποκλείεται
    περίπτωση "nameControl1" "nameControl2" "nameControl3"
    βρόχος
    άλλο περίπτωση
    «Μπορώ να ελέγξω ελέγχου
    Άθροισμα (Val (c.Tag)) + = Val (c.Text)
    τέλος επιλέξτε
    επόμενη

  19. Motta JR λέει:

    Χαιρετισμούς, πολύ ενδιαφέρων κώδικα.

    Έχω μια ερώτηση για σένα, έχω αναπτύξει μια MenuStrip που διαβάζει τα στοιχεία από μια βάση δεδομένων, όχι ότι δεν μπορεί να εκχωρήσει ένα ακόμη handler είναι ή διαδικασία συμβάντος σε κάθε στοιχείο του MenuStrip ελέγχου ή ανέκτησε τα ονόματα της διαδικασίας και της DB, κάποια sugenrencia; Μπορώ να χρησιμοποιήσω το παράδειγμα αρχείου που μπορεί να βρεθεί στα επόμενα url: http://www.dotnethelp.co.uk/es/vb/108413/menu_strip_vbnet
    Ευχαριστώ για τις προτάσεις

  20. Daniel λέει:

    Ήμουν τρελός να μην είναι σε θέση να φωτιά μέχρι τα γεγονότα μεταξύ εδώ και να διαβάσετε

    "Σε περίπτωση φόρτωσης της φόρμας προσθέστε τον ακόλουθο κώδικα:"

    Μου λείπει αυτό ακριβώς, μερικές φορές χάνομαι σε προφανή πράγματα, χάρη xD

  21. Edgar λέει:

    Μόλις άρχισα με τα γεγονότα και τους χειριστές και νομίζω ότι είναι περίπλοκη (για μένα), αλλά καλό να έχουμε ανθρώπους που συνεισφέρουν τις γνώσεις τους σε εμάς που principiamos ... ευχαριστώ Ελισσαιέ και όλοι όσοι έχουν συμπεριληφθεί κομμάτι τους.

    Χαιρετίσματα!

  22. Ο Ιησούς λέει:

    Είμαι νέος σε αυτό και το βρίσκω ενδιαφέρον και πολύ καλό παράδειγμα σας, πώς θα μπορούσε να πάει δημόσια και να είναι σε θέση να καλέσετε από οποιαδήποτε μορφή, χάρη ...

  23. Romina λέει:

    ακούσετε μια ερώτηση αν δεν μπορώ να βοηθήσω.
    Έχω να κάνω ένα πρόγραμμα να ελέγχει τον αγώνα με τα πλήκτρα κίνησης και θα ήθελα να μάθω πώς να αντιστοιχίσετε πλήκτρα με κουμπιά που θέτουν, από πάνω προς τα κάτω, αριστερά, δεξιά και όταν πατάτε το κουμπί πατημένο κάνει την προσομοίωση.

  24. Σέζαρ είπε:

    Αγαπητοί, ένα ερώτημα, πώς μπορεί να περάσει παραμέτρους για τη λειτουργία που αναφέρεται στην addessOf, η λειτουργία έχει μια παράμετρο (π.χ. IDBOTON), και για κάθε κουμπί που μπορώ να δημιουργήσω ψάχνω σε BD με πληροφορίες IDBOTON.

    Σας ευχαριστώ πολύ για τη βοήθειά σας.

  25. poncianux λέει:

    Έμαθα αυτό πριν από λίγο καιρό (1 ημέρα) LOL, αλλά φαίνεται περίπλοκη είναι πραγματικά εύκολη, ακόμα και καλέστε το φάσμα από ένα χαρακτηριστικό SQLCE χαιρετισμούς!

  26. Luis λέει:

    Γεια σας, πολύ ενδιαφέρουσα, εύχομαι να μπορούσε να μου πει πώς να εφαρμόσει τον κώδικα για να προσθέσετε τα γεγονότα κατά το χρόνο εκτέλεσης σε C #.
    Ευχαριστώ, επίσης, είναι να προσθέσει το event Click του picturebox μου δημιουργήθηκε κατά το χρόνο εκτέλεσης.
    Ευχαριστίες

  27. Javier λέει:

    Πολύ απλό αλλά πολύ πρακτικό. Σας ευχαριστώ πολύ

  28. Χάιντερ λέει:

    Γεια σου, εξαιρετική. Έχω μια ερώτηση, ο κωδικός αυτός λειτουργεί για τους ελέγχους που έχουν άμεση τοποθετούνται στη φόρμα. Αλλά το κάνουν να λειτουργήσει για τα εμπορευματοκιβώτια, χωρίς τοποθέτηση του φορτίου της φόρμας έναν κωδικό για κάθε εμπορευματοκιβώτιο;

    • Ελισσαιέ λέει:

      Μπορείτε να δημιουργήσετε μια αναδρομική συνάρτηση που ελέγχει αν ο έλεγχος καλείται και πάλι.
      Τότε θα σας αφήσει ένα παράδειγμα και θέλω να διευκρινίσω ότι δεν το έχω δοκιμάσει λόγω έλλειψης χρόνου, αλλά ήθελα να σας απαντήσω, όπως εγώ θα φύγουμε από εδώ.
      Χρησιμοποιήστε το ως βάση για τη λειτουργία σας. Τύχη.

      Private Sub Form1_Load (ByVal αποστολέα ως αντικείμενο, ByVal e Όσον System.EventArgs) Λαβές Me.Load
      recorrerContenedores (Ι)
      Sub End

      Υπο recorrerContenedores (ByVal Όπως Ελέγχου γ)
      Αν c.Controls.Count> 0 τότε
      recorrerContenedores (γ)
      Αλλού
      «Προσθήκη Πόμολα
      End If
      Sub End

  29. Heber λέει:

    Γεια Αγαπητέ, θα ήθελα να ξέρω αν χάσετε ένα μέρος του εγγράφου, επειδή στο τέλος, ενώ εγώ διάβαζα φαίνεται να επρόκειτο να εξηγήσω λίγο κώδικα και είναι κάτι σαν αυτό:

    Νομίζω ότι αξίζει να εξηγήσει λίγο την τελευταία κωδικό.
    Για κάθε τρέχει σε όλα ...

    Λείπει κάτι; θα μπορούσατε να συμπληρώσετε αν ναι; Σας ευχαριστώ και σας συγχαίρω για την συνεισφορά που κάνετε στην κοινότητα VB

  30. Χουάν Κάρλος λέει:

    γεια estubo buenaso αυτό, αλλά έχω ένα πρόβλημα, εάν έχετε συνειδητοποιήσει το έργο σας προσπαθεί να φορτώσει τη φόρμα .... και το πρόβλημά μου είναι δεν θέλω γι 'αυτό kiero ότι πατώντας το κουμπί πρόσθετο μου πρόσφατα, αρχίζει να λειτουργεί ως το χαμένο και πήρε από την εστίαση κάθε κουτάκι .. να με βοηθήσει σε αυτή τη γουλιά porfa reponde νωρίτερα χάρη ...
    saludosss ....

    • Ελισσαιέ λέει:

      Όχι απαραίτητα το addHandler πρέπει να είναι στο Load ... μπορείτε να το βάλετε όπου θέλετε. Εκτός από αυτό μπορείτε να χρησιμοποιήσετε (αν απαιτείται) τη δήλωση RemoveHandler για τη σύνδεση του ελέγχου εκδήλωση.

  31. Mario λέει:

    Wooow! Αυτό το παράδειγμα θα ήταν μια τεράστια βοήθεια, σας ευχαριστώ, πραγματικά. Αλλά φυσικά δεν μπορώ ^ ^ Χαιρετισμούς!

Σχόλιο