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

 

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

Μεταβίβαση EventHandler

Îåêßíçóå áðü ôï ìÝëïò SotirisPap. Τελευταία δημοσίευση από το μέλος SotirisPap στις 28-10-2009, 21:46. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-10-2009, 15:31 54779

    Μεταβίβαση EventHandler

    Καλησπέρα σας
    Σε ένα Windows Application με VB.NET τοποθέτησα μέσα σε ToolStrip μερικά ToolStripButton και έκανα σε αυτά
    AddHandler
     Private Sub ΕγκατάστασηΠρογραμμάτων()
    TοποθέτησηItem(Mn20, "Λογαριασμός", AddressOf ΛογαριασμόςAdd)
    TοποθέτησηItem(Mn20, "Ταμείο", AddressOf Ταμείο)
    End Sub
    Private Sub TοποθέτησηItem(ByVal Mn As ToolStrip, ByVal txt As String, ByVal e As System.EventHandler)
    Dim tsb As New System.Windows.Forms.ToolStripButton
    tsb.Text = txt
    Mn.Items.Add(tsb)
    AddHandler tsb.Click, AddressOf e.Invoke
    End Sub

    Κατόπιν σε ένα System.Windows.Forms.ContextMenuStrip Θέλω τους Handler των ToolStripButton που το καθένα όμως έχει και το δικό του διαφορετικό.
    Κάνω λοιπόν το παρακάτω
    Private Sub ΔημιουργίαCmΠρογράμματα(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles CmsΠρογράμματα.Opening
    For Each t20 As ToolStripButton In Mn20.Items
    ItemsAddCm(CmsΠρογράμματα,, t20.Text, AddressOf "Εδώ να μπαίνει ο Handler του ToolStripButton" )

    Next
    End Sub
    Private Sub TοποθέτησηItemsCm(ByVal Cm As System.Windows.Forms.ContextMenuStrip, ByVal onom As String, ByVal e As System.EventHandler)
    Dim b1 As New System.Windows.Forms.ToolStripMenuItem
    AddHandler b1.Click, AddressOf e.Invoke
    b1.Text = onom
    Cm.Items.Add(b1)
    End Sub
    Πως πρέπει να χειριστώ το
    ΑddressOf "Εδώ να μπαίνει ο Handler του ToolStripButton" γιά να πάρω τους Handler των ToolStripButton.
    Ευχαριστώ.

  •  28-10-2009, 21:03 54786 σε απάντηση της 54779

    Απ: Μεταβίβαση EventHandler

    Μια εύκολη και γρήγορη λύση είναι το παρακάτω:

        Private Sub ΔημιουργίαCmΠρογράμματα()
            For Each ts As ToolStripButton In Mn.Items
                TοποθέτησηItemsCm(ContextMenuStrip1, ts.Text, ts)
            Next
        End Sub
    
        Private Sub TοποθέτησηItemsCm(ByVal Cm As System.Windows.Forms.ContextMenuStrip, ByVal onom As String, ByVal ts As ToolStripButton)
            Dim b1 As New System.Windows.Forms.ToolStripMenuItem
            AddHandler b1.Click, AddressOf ToolStripMenuItem_Click
            b1.Text = onom
            b1.Tag = ts
            Cm.Items.Add(b1)
        End Sub
    
        Private Sub ToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            CType(CType(sender, ToolStripMenuItem).Tag, ToolStripButton).PerformClick()
        End Sub

    Ουσιαστικά, όταν δημιουργείς κάθε ToolStripMenuItem περνάς στο Tag property το αντίστοιχο ToolStripButton. Κατόπιν βάζεις όλα τα ToolStripMenuItems να βλέπουν στον ίδιο event handler κι εκεί αφού κάνεις τις απαραίτητες μετατροπές, από sender σε ToolStripMenuItem και από το Tag του σε ToolStripButton, βάζεις τελικά το αρχικό ToolStripButton να κάνει ένα virtual click.

    Ως λύση, είναι απλή και ξεμπερδεύεις γρήγορα. Ωστόσο έχει το μειονέκτημα ότι δεν μπορεί να επεκταθεί σε άλλα είδη από events καθώς δεν υπάρχουν τα αντίστοιχα PerformXXX. Εναλλακτικά, γίνεται με κάνεις ακριβώς αυτό που λές, να πάρεις τον event handler από το control ωστόσο θα χρειαστεί να παίξεις με reflection και δεν είναι και τόσο εύκολο.

    Τέλος, τέτοια σενάρια είναι κατάλληλα για να αρχίσεις να σκέφτεσαι για το Command Pattern

    http://en.wikipedia.org/wiki/Command_pattern

    http://www.dofactory.com/Patterns/PatternCommand.aspx

    http://www.vbdotnetheaven.com/UploadFile/rajeshvs/CommandPattern05252005073710AM/CommandPattern.aspx

    Αν σε ενδιαφέρει και θες βοήθεια στην υλοποίηση σε VB.NET, θα την βγάλουμε την άκρη...

     

     


    Vir prudens non contra ventum mingit
  •  28-10-2009, 21:46 54789 σε απάντηση της 54786

    Απ: Μεταβίβαση EventHandler

    Σε ευχαριστώ KelMan
    Aυτό ακριβώς χρειάζομαι.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems