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

 

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

Επικοινωνία μεταξύ User Controls and Forms

Îåêßíçóå áðü ôï ìÝëïò bigN. Τελευταία δημοσίευση από το μέλος bigN στις 04-06-2009, 12:26. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-05-2009, 16:24 50867

    Επικοινωνία μεταξύ User Controls and Forms

    Γεια σας, 

    Έχω μια ερώτηση σχετικά με την επικοινωνία μεταξύ δύο User Control. Εν ολίγις προσπαθώ να μετατρέψω την εφαρμογή μου (C#) όπου χρησιμοποιώ εκτεταμένα Tab panels σε ένα πιο φιλικό GUI. Η κύρια φόρμα μου αποτελείται από split container όπου στο αριστερό πανελ έχω τα κουμπιά και στο δεξι πάνελ εμφανίζονται εναλλάξ τα user control. Έχω καταφέρει να εμφανίζονται σωστά τα User Control, όμως αυτό που προσπαθώ να κάνω είναι να συλλέξω τις πληροφορίες από το user control 1, να κάνω τους υπολογισμούς, και να εμφανίσω τα αποτελέσματα στο user control 2.  Κάθε φορά στην φόρμα φαίνεται μόνο το ένα user control.

    Η άλλη εκδοχή είναι να εμφανίσω τα αποτελέσματα στην κύρια φόρμα.

    Ευχαριστώ.
    Δημοσίευση στην κατηγορία:
  •  21-05-2009, 19:03 50872 σε απάντηση της 50867

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    Ποιά είναι η πρώτη εκδοχή? και ποιά ή άλλη? Τι Controls είναι? τι εννοείς κάθε φόρα φαίνεται μόνο 1 Control?

    Δεν παίζει να κατάλαβε κανείς φίλε μου :(


  •  26-05-2009, 14:23 50985 σε απάντηση της 50867

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    Θα πρότεινα να κάνεις διαχωρισμό απεικόνισης και δεδομένων (σύμφωνα με το Model-View-Controller pattern). Επειδή δεν υπάρχει πλήρως καθορισμένος τρόπος υλοποίησης του Model-View-Controller σε WinForms, αυτό που γίνεται σε γενικές γραμμές είναι:
    1) να ορίσεις ένα σετ από κλάσεις για να αποθηκεύεις δεδομένα
    2) να δημιουργήσεις αντικείμενα από αυτές τις κλάσεις και να αποθηκεύσεις μέσα τα δεδομένα που θέλεις - αυτό θα γίνει π.χ. στο UserControl1
    3) να ορίσεις ένα event που να λέει "το UserControl1 έχει καινούρια δεδομένα" και να καλεί ένα event handler ορισμένο π.χ. στο UserControl2
    4) το event handler στο UserControl2 θα λέει "όταν έχω καινούρια δεδομένα από άλλο UserControl θέλω να τα απεικονίσω"
    4Β) άρα εδώ στο event handler θα διαβάσεις τα δεδομένα από τις κλάσεις του βήματος (1) και θα θέσεις το UserControl2 ως ενεργό

    Αν θες να μάθεις περισσότερα, στείλε email να σου δώσω κώδικα με χειροπιαστό παράδειγμα, ή στείλε μου το δικό σου πρόγραμμα να σου πω πώς να το βελτιώσεις. (panos_g78 "at" yahoo "dot" com)

     


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
    Δημοσίευση στην κατηγορία: ,
  •  26-05-2009, 16:10 50996 σε απάντηση της 50985

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    Σε ευχαριστώ φίλε, μετά από πολλη ψάξιμο.... βρήκα τον τρόπο που αναφέρεις (αναφορικά με τα events).

    http://www.akadia.com/services/dotnet_user_controls.html#Communication%20between%20User%20Controls%20and%20subscribing%20Applications

    Σχετικά με το (Model-View-Controller pattern) χωρίς να το θέλω :) .... έχω ακολουθήσει ακριβώς αυτή την κατεύθυνση ΟΟP... δηλ. έχω χωρίσει σε αντικείμενα τη ροή του προγράμματος και το μόνο που κάνω είναι να Τα καλώ μέσω user controls...

    /////
     4Β) άρα εδώ στο event handler θα διαβάσεις τα δεδομένα από τις κλάσεις του βήματος (1) και θα θέσεις το UserControl2 ως ενεργό
    ////
    Όταν λες "ως ενεργό" εννοείς
    UserControl.visible =true;

    Κάτι άσχετο ακόμα..... τα user control τα δημιουργώ στο contrsuctor και μετα τα κρύβω ή τα εμφανίζω ανάλογα με την περίσταση....  είναι "σωστό" αυτό ή καλύτερο θα ήταν να δημιουργώ κάθε φορά κανούργιο user control και το παλιο να γίνεται disposed?



  •  27-05-2009, 01:19 51007 σε απάντηση της 50996

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    Έτσι στα πεταχτά σου δείχνω ένα παράδειγμα του τι μπορεί να σημαίνει ενεργό UserControl. Όλα στο παράδειγμα είναι στατικά και χωρίς interfaces.

    Α) η μαμά φόρμα

    (Γραφικά, φαντάσου 2 κουμπιά αριστερά και ένα άδειο panel δεξιά)

    namespace MultiCustomControlChooser

    {

         public partial class MainForm : Form

         {

              public MainForm()

              {

                   InitializeComponent();

              }

     

              private UserControl m_myActiveControl = null;

     

              private void button1_Click(object sender, EventArgs e)

              {

                   if (m_myActiveControl != null)

                        m_myActiveControl.Dispose();

                   m_myActiveControl = new MyCustomControl1();

                   panel1.Controls.Add(m_myActiveControl);

              }

     

              private void button2_Click(object sender, EventArgs e)

              {

                   if (m_myActiveControl != null)

                        m_myActiveControl.Dispose();

                   m_myActiveControl = new MyCustomControl2();

                   panel1.Controls.Add(m_myActiveControl);

              }

         }

    }

     

    Β) UserControl αντικείμενα που αναφέρονται παραπάνω

     

         public partial class MyCustomControl1 : UserControl

         {

              public MyCustomControl1()

              {

                   InitializeComponent();

                   Populate();

              }

     

              private void Populate()

              {

                   checkBox1.Checked = true;

                   checkBox2.Checked = false;

                   checkBox3.Checked = false;

              }

         }

         public partial class MyCustomControl2 : UserControl

         {

              public MyCustomControl2()

              {

                   InitializeComponent();

                   Populate();

              }

     

              private void Populate()

              {

                   label1.Text = "First";

                   label2.Text = "Second";

                   label3.Text = "Third";

              }

         }

     

    Με λίγα λόγια η μαμά έχει ένα μέλος (member variable) UserControl, και ένα Control container, το panel1. To να κάνεις ένα UserControl Visible σημαίνει ότι πρέπει να δημιουργήσεις ένα από κάθε είδος (new MyCustomControl1(), new MyCustomControl2(), new MyCustomControl3(), κλπ.) και να έχεις ένα μηχανησμό που να έχει μόνο ένα ορατό κάθε χρονική στιγμή. Πέραν του ότι έτσι χαλάει η εντροπία του σύμπαντος και θα πέσει ο ουρανός στα κεφάλια μας, όλα αυτά τα αντικείμενα κάθονται στη μνήμη και την ξοδεύουν άσκοπα. Το panel1 έχει ένα ControlCollection στο οποίο μπορείς άνετα να κάνεις Add() όπως δείχνω, και Remove() όταν δεν το χρειάζεσαι.

    Αν και δεν είμαι απόλυτα σίγουρος, το Remove() θα θέσει αυτόματα το αντικείμενο σε Disposable state, οπότε στην επόμενη γύρα ο σκουπιδιάρης (GarbageCollector) θα το συμμαζέψει. Για σιγουριά (εγώ ή εσύ ο ίδιος) πρέπει να τρέξω π.χ. το πρόγραμμα σε Debug mode βήμα-βήμα και να βλέπω το GDI Object count στον TaskManager.

     

    Σκέψου για λίγο πώς θα μπορούσε κανείς να έχει προγραμματίσει τον Internet Explorer/ Firefox. Κάθε καινούριο Tab που προσθέτεις σημαίνει ότι γίνεται κάτι παρόμοιο με το παραπάνω παράδειγμα. Μια διαφορά είναι ότι αντί για ένα UserControl member, o Explorer θα είχε ένα List<UserControl> m_lstTabs, όπου καλεί την Add/Remove.

     


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
    Δημοσίευση στην κατηγορία:
  •  27-05-2009, 10:45 51013 σε απάντηση της 51007

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    panagiotis_georgiadis:

    Πέραν του ότι έτσι χαλάει η εντροπία του σύμπαντος και θα πέσει ο ουρανός στα κεφάλια μας, όλα αυτά τα αντικείμενα κάθονται στη μνήμη και την ξοδεύουν άσκοπα. Το panel1 έχει ένα ControlCollection στο οποίο μπορείς άνετα να κάνεις Add() όπως δείχνω, και Remove() όταν δεν το χρειάζεσαι.

    Αν και δεν είμαι απόλυτα σίγουρος, το Remove() θα θέσει αυτόματα το αντικείμενο σε Disposable state, οπότε στην επόμενη γύρα ο σκουπιδιάρης (GarbageCollector) θα το συμμαζέψει. Για σιγουριά (εγώ ή εσύ ο ίδιος) πρέπει να τρέξω π.χ. το πρόγραμμα σε Debug mode βήμα-βήμα και να βλέπω το GDI Object count στον TaskManager.

     

    Σκέψου για λίγο πώς θα μπορούσε κανείς να έχει προγραμματίσει τον Internet Explorer/ Firefox. Κάθε καινούριο Tab που προσθέτεις σημαίνει ότι γίνεται κάτι παρόμοιο με το παραπάνω παράδειγμα. Μια διαφορά είναι ότι αντί για ένα UserControl member, o Explorer θα είχε ένα List<UserControl> m_lstTabs, όπου καλεί την Add/Remove.

     



    Ήταν ακριβώς αυτό που έψαχνα, μου άρεσε ο τρόπος προσέγγισής σου ( με το m_myActiveControl ) .... σε ευχαριστώ φίλε.....
    θα συμπληρωσω το παράδειγμα σου με το event handler και είμαι ok:).
  •  04-06-2009, 12:26 51312 σε απάντηση της 51013

    Απ: Επικοινωνία μεταξύ User Controls and Forms

    panagiotis_georgiadis:
    Σκέψου για λίγο πώς θα μπορούσε κανείς να έχει προγραμματίσει τον Internet Explorer/ Firefox. Κάθε καινούριο Tab που προσθέτεις σημαίνει ότι γίνεται κάτι παρόμοιο με το παραπάνω παράδειγμα. Μια διαφορά είναι ότι αντί για ένα UserControl member, o Explorer θα είχε ένα List<UserControl> m_lstTabs, όπου καλεί την Add/Remove.


    Σχετικα με την τελευταία παρατήρησή σου θα ήθελα να σε ρωτήσω το εξής :
    Από τη στιγμή που όλα τα controls βρίσκονται στο List<UserControl> m_lstTabs επομένως δεν γίνονται disposed() άρα και η κατανάλωση πόρων αυξάνεται με το άνοιγμα περισσότερων καρτελών.
    Πως θα μπορούσαν να αλληλεπιδράσουν τα controls μεταξύ τους π.χ με τα events?

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