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

 

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

Παρακολούθηση αλλαγών σε ένα Collection

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος pontifikas στις 11-07-2007, 13:59. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  04-07-2007, 11:51 33372

    Παρακολούθηση αλλαγών σε ένα Collection

    Έχω μια κλάση που κάνει inherit την CollectionBase.
    Αυτό που θέλω είναι να μπορώ να ξέρω αν προστέθηκε, αφαιρέθηκε ή μεταβλήθηκε μια εγγραφή μέσα στο Collection αλλά δυστυχώς τα Colletions δεν έχουν events.
    Πώς μπορώ να το κάνω αυτό? Υπάρχει κάποιο Interface που μπορώ να κάνω implement ή κάτι τέτοιο?

    Ευχαριστώ Smile
  •  04-07-2007, 12:05 33373 σε απάντηση της 33372

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Για την προσθήκη/αφαίρεση, θα μπορούσες να το κάνεις αν μπορούσες να κάνεις override τις Add/Remove methods του Collection base. Δυστηχώς δεν μπορείς. Μπορείς όμως αντί να κάνεις inherit να κάνεις implement το ICollection και να το υλοποιήσεις από την αρχή. Δεν είναι τόσο δύσκολο. Έτσι θα μπορέσεις να σηκώνεις ένα event κάθε φορά που εκτελείται η add ή η remove.

    Για μεταβολή, αν εννοείς αντικατάσταση item από ένα άλλο με κώδικα της μορφής MyCollection[2] = myNewItem; τότε γίνεται με τον ίδιο τρόπο βάζοντας το event στο Item property του collection σου. Αν μεταβολή εννοείς την αλλαγή οποιουδήποτε property στα αντικείμενά σου, τότε πιο δύσκολα τα πράγματα. Αν θέλεις αυτό, πες το να συνεχίσουμε!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  04-07-2007, 13:04 33375 σε απάντηση της 33373

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Dimitris Papadimitriou:

    Για μεταβολή, αν εννοείς αντικατάσταση item από ένα άλλο με κώδικα της μορφής MyCollection[2] = myNewItem; τότε γίνεται με τον ίδιο τρόπο βάζοντας το event στο Item property του collection σου. Αν μεταβολή εννοείς την αλλαγή οποιουδήποτε property στα αντικείμενά σου, τότε πιο δύσκολα τα πράγματα. Αν θέλεις αυτό, πες το να συνεχίσουμε!



     Βασικά αυτό που με καίει περισσότερο είναι η παρακολούθηση των αλλαγών.
     Θέλω όποτε αλλάζει, είτε κάποιο αντικείμενο στο Collection  είτε η τιμή κάποιου property σε κάποιο αντικείμενο, να μπορώ να το ξέρω.

  •  04-07-2007, 13:29 33376 σε απάντηση της 33372

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Δεν σε βολεύει να χρησιμοποιήσεις την κλάση BindingList(Of T); Παρέχει το ListChanged event που πιστεύω θα σε καλύψει.


    Vir prudens non contra ventum mingit
  •  04-07-2007, 13:36 33379 σε απάντηση της 33375

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Τότε λοιπόν, έχουμε και λέμε:

    1) Καταρχήν θα υλοποιήσεις το INotifyPropertyChange interface στα αντικείμενα που προσθέτεις στο collection. Οδηγίες εδώ.

    2) Στο Add του collection (θα κάνεις όλα αυτά που είπα πριν για να έχεις έλεγχο για το τι γίνεται στο Add) θα κάνεις το εξής:

                try
                {
                    System.ComponentModel.INotifyPropertyChanged notifyObject = (System.ComponentModel.INotifyPropertyChanged)this;
                    notifyObject.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(notifyObject_PropertyChanged);
                }
                catch (InvalidCastException)
                {
                    throw new Exception("Items in this colleciton must implement the INotifyPropertyChanged interface");
                }

    Η notifyObject_PropertyChanged είναι η method που θα καλείται κάθε φορά που αλλάζει κάτι σε κάποιο αντικείμενο και σε αυτή εσύ θα σηκώνεις ένα event για να το πιάσει αυτός που έχει reference στο collection σου.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  04-07-2007, 14:03 33380 σε απάντηση της 33379

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

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

    Dimitris Papadimitriou:

    Τότε λοιπόν, έχουμε και λέμε:

    1) Καταρχήν θα υλοποιήσεις το INotifyPropertyChange interface στα αντικείμενα που προσθέτεις στο collection. Οδηγίες εδώ.

    2) Στο Add του collection (θα κάνεις όλα αυτά που είπα πριν για να έχεις έλεγχο για το τι γίνεται στο Add) θα κάνεις το εξής:

                try
                {
                    System.ComponentModel.INotifyPropertyChanged notifyObject = (System.ComponentModel.INotifyPropertyChanged)this;
                    notifyObject.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(notifyObject_PropertyChanged);
                }
                catch (InvalidCastException)
                {
                    throw new Exception("Items in this colleciton must implement the INotifyPropertyChanged interface");
                }

    Η notifyObject_PropertyChanged είναι η method που θα καλείται κάθε φορά που αλλάζει κάτι σε κάποιο αντικείμενο και σε αυτή εσύ θα σηκώνεις ένα event για να το πιάσει αυτός που έχει reference στο collection σου.


    Τα αντικείμενα που αποθηκεύονται στο Collection δεν έχουν properties για να μπορέσω να βάλω το event στην αλλαγή των τιμών. Εχουν μόνο fields.

    Kelman
    Φοβάμαι είναι πολύ δαπανηρή αυτή η αλλαγή(σε χρόνο και έκταση αλλαγών). Αλλά θα την δοκιμάσω.

  •  04-07-2007, 14:17 33381 σε απάντηση της 33380

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Αν έχεις τέτοια constraints γιατί δεν τα λες από την αρχή να ξέρουμε κι εμείς τι γίνεται;

    Κατά τα άλλα εμείς απλά δίνουμε ιδέες και εσύ επιλέγεις πια εφαρμόζεται καλύτερα στην περίπτωσή σου. Οπότε μην περιμένεις έτοιμη τη λύση!

    Πάντως δεν νομίζω ότι μπορείς να πάρεις με κάποιο τρόπο event ότι άλλαξε ένα field.
     


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  04-07-2007, 18:11 33389 σε απάντηση της 33372

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

    Υπάρχει τρόπος να κάνεις αυτό που θες με events. Επειδή το CollectionBase δεν έχει events θα χρησιμοποιήσουμε ένα άλλο control. BindingSource. Αυτό έχει αυτά που χρειαζόμαστε. Θα το χρησιμοποιήσουμε ως εξής.

    Dim withevents BS as new BindingSource

    BS.Datasource=MyCollection

    Μέχρι εδώ καλά. Αν τώρα περάσει ένα καινούριο object μέσα στο collection ή δiαγραφεί μπορούμε χρησιμοποιώντας το BindingSource να το πιάσουμε.

    BS.Add(myObject)

    Το πρόβλημα είναι όταν αλλάξει κάποιο Property. Εκεί θα πρέπει το Object να υλοποιήσει το INotifypropertyChange κάτι που όπως είπες δεν μπορείς να το κάνεις. Για να το ξεπεράσεις και αυτό θα κάνεις το εξής

    Dim xObject as myObject

    xObject=CType(BS.Current,myObject)

    Μετά γράψε κώδικα στο Event του BindingSource CurrentItemChange ή ListChanged.

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

    Αν σε προβλημάτισα λίγο διάβασε για το BindingSource control και αν έχεις κάποια απορία τα ξαναλέμε.

     

     

  •  11-07-2007, 13:59 33531 σε απάντηση της 33389

    Απ: Παρακολούθηση αλλαγών σε ένα Collection

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

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