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

 

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

Index property σε Controls

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος gmlogic στις 20-01-2006, 10:28. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-01-2006, 12:23 8805

    Smile [:)] Index property σε Controls

    Παιδιά πως παίζει το Index Property πχ του TextBox σε VB.NET

    για μαζική διαχείρηση των controls σε μια φόρμα

    Γιώργος.Μ

    Ευχαριστώ


    George Matzouranis
  •  19-01-2006, 12:57 8806 σε απάντηση της 8805

    Απ: Index property σε Controls

    Γεια σου.

    Το index property με σκοπό τη μαζική διαχείριση controls σε μία φόρμα δεν υποστηρίζεται πλέον από την VB.NET και γενικά κάθε είδους Control Array.

    Για κάθε φόρμα που δημιουργείς υπάρχει η ControlCollection class. Μπορείς μέσα από εκεί να κάνεις αυτό που θες.

    Ελπίζω να βοήθησα.

  •  19-01-2006, 13:02 8807 σε απάντηση της 8805

    Απ: Index property σε Controls

    Υπάρχει κανένα παράδειγμα
    Ευχαριστώ πολύ
    George Matzouranis
  •  19-01-2006, 13:15 8808 σε απάντηση της 8805

    Απ: Index property σε Controls

    Υποθέτω ότι αναφέρεσαι σε αυτό που κάναμε παλιότερα στη VB 6, να ορίσεις δηλαδή control arrays και να αναφέρεσαι μέσω ενός index σε κάποιο control μέσα από μια ομάδα. Πχ textbox(i).text=”” για να κάνεις reset το text σε όλα τα textboxes.

    Στη VB.NET δεν υποστηρίζονται control arrays. Ωστόσο, μπορείς να κάνεις ένα σωρό κόλπα για να αντικαταστήσεις αυτή τη λειτουργικότητα και μάλιστα με πιο κομψό τρόπο. Για παράδειγμα, μπορείς να ομαδοποιήσεις όλα τα controls που σε ενδιαφέρουν σε ένα ArrayList και κατόπιν να κάνεις ένα iteration σε όλα τα items για να καλέσεις κάποιο method ή να ορίσεις κάποιο property. Πχ

            Dim ButtonList As New ArrayList

            ButtonList.Add(Button1)
            ButtonList.Add(Button2)
            ButtonList.Add(Button3)

            For Each btn As Button In ButtonList
                btn.Enabled = False
            Next

    Το ωραίο είναι ότι με αυτόν τον τρόπο μπορείς να ορίσεις collections από διάφορα controls που όλα μοιράζονται κάποιο κοινό property ή method.  Σε περίπτωση που έχεις ένα control array από διάφορα controls και θέλεις να κάνεις κάτι μόνο σε κάποια από αυτά, μπορείς να κάνεις το εξής

            Dim ButtonList As New ArrayList

            ButtonList.Add(Button1)
            ButtonList.Add(Button2)
            ButtonList.Add(Button3)
            ButtonList.Add(TextBox1)
            ButtonList.Add(TextBox2)

            For Each ctrl As Control In ButtonList
                If TypeOf ctrl Is TextBox Then
                    CType(ctrl, TextBox).ReadOnly = False
                End If
            Next

    Όπου βασικά τα θεωρείς όλα controls και ελέγχεις τον τύπο τους, οπότε μόνο αν σου κάνει, τα μετατρέπεις σε αυτό που θέλεις (Ctype) και κατόπιν τα χειρίζεσαι όπως θέλεις.

    Τέλος, για να πίασεις ένα event από μια ομάδα controls, μπορείς να κάνεις το παρακάτω:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click

        End Sub

    Όπου πλέον μέσα στην procedure χρησιμοποιείς το sender object για να βρεις ποιο από τα controls προκάλεσε το event. Π.χ.

       MessageBox.Show(CType(sender, Button).Name)

    για να πάρεις το όνομα του control.

    Αν έχεις πολλά controls τα οποία είτε δημιουργείς δυναμικά με τον κώδικά σου, είτε βαριέσαι να γράφεις στο handles του Button1_Click, μπορείς να συνδέσεις το event με την procedure με χρήση κώδικα:

            AddHandler Button3.Click, AddressOf Button1_Click

    Πρόσεξε μην ξεχάσεις το AddressOf. Και πάλι, μπορείς να βάλεις τον ίδιο event handler να χειρίζεται διαφορετικά events από το ίδιο controls ή άλλα controls. Πχ

            AddHandler RadioButton1.CheckedChanged, AddressOf CheckedChanged
            AddHandler RadioButton2.CheckedChanged, AddressOf CheckedChanged
            AddHandler CheckBox1.CheckedChanged, AddressOf CheckedChanged

    Ο μόνος περιορισμός είναι να είναι συμβατά τα ορίσματα του event handler procedure, δηλαδή το

        Private Sub Button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Button1.KeyPress

        End Sub

    και το

        Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown

        End Sub

    όπως παρατηρείς έχουν διαφορετικό τύπο του e ορίσματος και άρα τα αντίστοιχα event χρειάζονται το καθένα τον δικό του handler.

    Αυτά τα ολίγα και γενικά. Αν χρειαστείς κάτι συγκεκριμένο εδώ είμαστε…

     


    Vir prudens non contra ventum mingit
  •  19-01-2006, 13:30 8810 σε απάντηση της 8808

    Απ: Index property σε Controls

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

    Dim Ctrl as Control
    For Each Ctrl In Me.Controls
    If TypeOf(Ctrl) Is TextBox Then Ctrl.Text=""
    Next

    Κάθε φόρμα που δημιουργούμε δημιουργεί την ControlCollection Class η οποία κρατάει όλα τα controls που βάζουμε στην φόρμα. Με το Controls Property της φόρμας αναφερόμαστε σε αυτή την class.
  •  19-01-2006, 13:57 8811 σε απάντηση της 8810

    Απ: Index property σε Controls

    Θελει λίγο προσοχή μόνο αν έχεις panels στη φόρμα, τα οποία περιέχουν τα δικά τους controls. Σε αυτή την περίπτωση, αν θυμάμαι καλά, πρέπει να τρέξεις ένα recursion για κάθε panel για να πάρεις τα controls που βρίσκονται μέσα σε αυτό, μια και το Me.Controls στη φόρμα θα σε φτάσει μέχρι το panel, και όχι μέχρι τα controls που βρίσκονται μέσα σε αυτό.

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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  19-01-2006, 14:03 8813 σε απάντηση της 8805

    Απ: Index property σε Controls

    ΟΚ
    Απλά νομίζω κατά τον σχεδιασμό της form σε VB6 σου
    πρότεινε το όνομα όταν δημιoυργούσες array και ήταν ποιό εύκολο να μην ξαναγράφεις το name αλλά η διαφορά ήταν στο index
    υπάρχει τίποτε γιά αυτό

    George Matzouranis
  •  19-01-2006, 14:05 8814 σε απάντηση της 8811

    Απ: Index property σε Controls

    Έχεις δίκιο. Έτσι είναι τα πράγματα. Αν έχουμε controls στην φόρμα που περιέχουν άλλα controls το παραπάνω θα φτάσει μέχρι το Container Control. Οπότε μία παραλλαγή του παραπάνω κώδικα που έγραψα για να λύση αυτό το πρόβλημα είναι η εξής :

    Dim Ctrl as Control
    For Each Ctrl In Me.Controls
    If TypeOF(Ctrl) Is TextBox Then Ctrl.Text=""
    If Ctrl.HasChildren Then
    Dim ChildCtrl as Control
    For Each ChildCtrl In Ctrl.Controls
    If TypeOF(ChildCtrl) Is TextBox Then ChildCtrl.Text=""
    Next
    End If
    Next

    Έτσι λύνεται και το πρόβλημα του Container.
  •  19-01-2006, 14:46 8817 σε απάντηση της 8814

    Απ: Index property σε Controls

    Αυτό δεν είναι ακριβώς recursion...  Στον παραπάνω κώδικα, αν ένα panel περιέχει ένα group box, τότε πάλι δεν πιάνεις τα controls του. Για να φτιάξεις recursion χρειάζεσαι ένα function που θα καλεί τον εαυτό του. Ωστόσο, θα πρέπει να ενσωματώσεις και το business logic μέσα, οπότε μπλέκεται αρκετά το πράγμα. Γι αυτόν το λόγο πρότεινα την πρώτη λύση με την οποία μπορείς να γκρουπάρεις λογικά τα controls. Για παράδειγμα, αν θες να εφαρμόσεις ένα validation rule, μπορείς να φτιάξεις ένα ArrayList και να το γεμίσεις με τα ανάλογα controls και με το iteration να κάνεις τον έλεγχο. Αν θες και δεύτερο validation rule, το κάνεις με δεύτερο ArrayList. Με αυτόν τον τρόπο μπορεί ένα control να ανήκει και στα δύο ArrayLists και να ελέγχεται ανάλογα με τις ανάγκες.

    Πάντως gmlogic, όχι, δεν υπάρχει κάτι σαν τη συμπεριφορά της VB6. Τώρα κερδίζεις σε ευελιξία, αλλά πρέπει να κάνεις λίγο κόπο παραπάνω...


    Vir prudens non contra ventum mingit
  •  19-01-2006, 15:13 8818 σε απάντηση της 8805

    Απ: Index property σε Controls

    Μήπως υπάρχει κάτι να δώσω για να μου προτείνει
    το TextBox.Name στο Copy του control γιατί δινει TextBox1 μετά TextBox2 κλπ
    ή είναι εσωτερικό της VB.NET ?

    Ευχαριστώ για όλα


    George Matzouranis
  •  19-01-2006, 21:45 8821 σε απάντηση της 8818

    Απ: Index property σε Controls

    Δεν χρησιμοποιώ recursion στο παραπάνω παράδειγμα απλά απάντησα τι γίνεται στην περίπτωση που έχουμε container control τι γίνεται, για να δει κάποιος ότι υπάρχει και το HasChildren Property που μπορεί να χρησιμοποιηθεί σε μία τέτοια περίπτωση.

    Όπως σωστά σημείωσες και εσύ το τι γίνεται στην περίπτωση που έχω container control μέσα σε container. Εκεί ναι θα χρησιμοποιηθεί recursion που να κάνει και αυτό. Απλά τα παραδείγματα δόθηκαν με τέτοιο τρόπο, απλό και κατανοητό για να κατανοήσουμε το πως χρησιμοποιούμε κάποια properties που μας δίνονται. Από εκεί και πέρα υπάρχουν αμέτρητες παραλλαγές.

    Όσο για αυτό που αναφέρεις gmlogic έχεις τόσο κώδικα να γράψεις και σε ενδιαφέρει η ονομασία που δίνει το Visual Studio? :)
  •  20-01-2006, 10:28 8826 σε απάντηση της 8805

    Απ: Index property σε Controls

    Φίλε Γιώργο σε ευχαριστώ
    Απλά το παρακάνω λίγο με την παραμετροποίηση για αυτό και ρωτάω !!! :)

    Γιώργος Μ.
    George Matzouranis
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems