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

 

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

Κλήση συνάρτησης από ένα window σε άλλο

Îåêßíçóå áðü ôï ìÝëïò tarasiadis. Τελευταία δημοσίευση από το μέλος tarasiadis στις 02-06-2009, 15:36. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-05-2009, 15:20 50626

    Κλήση συνάρτησης από ένα window σε άλλο

    Θέλω κάτι βασικό και έχω κολλήσει.
    Έχω ένα window που έχει ορισμένη μία συνάρτηση στην βασική κλάση όπως πχ παρακάτω:

    void Button_Click_Exit(object sender, RoutedEventArgs e)
            {
                this.Close();
            }

    Την συγκεκριμένη πχ την εχω ορίσει να εκτελείται σε κλικ πάνω σε ένα button του window1

    Τώρα θέλω από το Window2 να καλέσω την Button_Click_Exit(object sender, RoutedEventArgs e)
    Όμως δεν μπορώ να την καλέσω χωρίς ορίσματα. Επίσης τα ορίσματα object sender, RoutedEventArgs e δημιουργούνται αυτόματα όταν δημιουργώ ένα νέο click σε ενα button.
    Δεν ξέρω πως να την καλέσω ή τι ορίσματα να βάλω.

    Μια μικρή βοήθεια;
  •  11-05-2009, 16:24 50636 σε απάντηση της 50626

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

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

    π.χ
    Η κλάση με την μέθοδο:
    1
    2
    3
    4
    5
    6
    7
     
    class Demo
    {
            public  static void LoadingEventHandler(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Demo");
            }
    }

    Και έχω κάνει ένα WPF Window και στον contructor έχω βάλει στο Event Loaded να καλεί την στατική μέθοδο:
    1
    2
    3
    4
    5
    6
    7
    8
     
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Demo.LoadingEventHandler);
            }
        }




    Iraklis Karagkiozoglou
  •  11-05-2009, 16:34 50638 σε απάντηση της 50626

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Μάλλον θέλεις να καλέσεις την Button.PerfomClick() Method...
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  11-05-2009, 16:47 50641 σε απάντηση της 50638

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Η PerformClick() δεν κάνει γιατί δεν θέλει να την καλεί από το ίδιο παράθυρο.
    Iraklis Karagkiozoglou
  •  11-05-2009, 16:49 50642 σε απάντηση της 50636

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    ikaragkiozoglou:
    Εγώ θα πρότεινα να κάνεις μία κλάση, εκεί θα κάνεις μία στατική και public μέθοδο και θα την βάλεις στο event που θές στο contructor του παραθύρου

    π.χ
    Η κλάση με την μέθοδο:
    1
    2
    3
    4
    5
    6
    7
     
    class Demo
    {
            public  static void LoadingEventHandler(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Demo");
            }
    }

    Και έχω κάνει και ένα WPF Window και στον contructor έχω βάλει να βάζει στο Event Loaded να καλεί την στατική μέθοδο:
    1
    2
    3
    4
    5
    6
    7
    8
     
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Demo.LoadingEventHandler);
            }
        }




    Λίγο μπερδεύτικα, και ίσως να μην σας έδωσα καλή περιγραφή του προβλήματος μου.

    πχ έχω πολλά παράθυρα και θέλα από το ένα να καλέσω μια συνάρτηση ενος άλλο παραθύρου. Προσπάπησα με
    OnomaWindow.Onoma_sinartisis();
    αλλά δεν τα κατάφερα.

    Το παράδειγμα με τα ορίσματα(object sender, RoutedEventArgs e)
    το έδωσα γιατί κάποιες από τις συναρτήσεις που θέλω να καλέσω έχουν αυτά τα ορίσματα που δεν ξέρω ΄τι είναι.Κάποιες όμως, δικές μου, δεν έχουν ορίσματα.

    Απολά θέλω να καλώ μια συνάρτηση που ανήκει στο παραθυρο Α από το παράθυρο Β.
  •  11-05-2009, 16:56 50643 σε απάντηση της 50642

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Αυτή η μέθοδος που θες να καλείς τη ακριβώς κάνει?

    Πέρνει δεδομένα απο την Φόρμα Α που είναι?

    Iraklis Karagkiozoglou
  •  11-05-2009, 17:55 50647 σε απάντηση της 50643

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Οχι δεν παίρνει δεδομένα από το παράθυρο όπου την καλώ. Φαντάζομαι πως αν ήθελα κάτι τέτοιο θα έπρεπε να περάσω τα data αυτά στα ορίσματα.

    Πχ κάτι απλό, ένα exit - κλείσιμο παραθύρου.
  •  14-05-2009, 14:38 50707 σε απάντηση της 50647

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Για να μπορέσεις να καλέσεις μια μέθοδο σε μια κλάση, θα πρέπει αυτή να είναι static. Όταν προσπάθησες με την «OnomaWindow.Onoma_sinartisis();» έκανες ακριβώς αυτό.

     

    Για να καλέσεις μια μέθοδο σε ένα αντικείμενο θα πρέπει να έχεις μια αναφορά προς αυτό το αντικείμενο. Πχ.

                Form NewForm = new Form();

                NewForm.Show();

    Το NewForm είναι το αντικείμενο της κλάσης Form.

     

    Εφόσον μιλάς για πολλές φόρμες τότε θα υπάρχει και κάποια Parent form. Οπότε μπορείς να ελέγξεις την MdiChildren αυτής για να βρεις την φόρμα που επιθυμείς. Δοκίμασε τον παρακάτω κώδικα στο κλικ του button.

     

          Form1 otherForm = null;

     

                foreach (Form childForm in this.MdiParent.MdiChildren)

                {

                    otherForm = childForm as Form1;

     

                    if (otherForm == null)

                    {

                        MessageBox.Show("not found");

                    }

                    else

                    {

                        MessageBox.Show("found");

                        otherForm.Close();

                    }

                }

     

    Αν έχεις πολλά αντικείμενα της Form1 τότε θα κλείσουν όλα.

  •  02-06-2009, 12:22 51226 σε απάντηση της 50707

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Βρέθηκε λύση για όποιον ενδιαφέρεται στο
    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7a058dc6-e60a-4c5b-a920-8d46dfe30b0f
  •  02-06-2009, 14:22 51230 σε απάντηση της 51226

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Παιδιά, νομίζω ότι το παρακάνατε. Καταρχήν, το θέμα το έχουμε ξανασυζητήσει δεκάδες φορές. Μία απλή αναζήτηση θα σας είχε δώσει αμέσως την απάντηση. Κατά κανόνα κάποιος έρχεται και ρωτάει πως θα πειράξει τα controls μίας φόρμας από μία άλλη φόρμα. Η απάντηση πάντα είναι ότι αυτό είναι κακή ιδέα και καλύτερα να φτιάξει μεθόδους τις οποίες θα καλεί από την άλλη φόρμα.
    Ακριβώς επειδή το θέμα έχει εξαντληθεί δεν συμμετείχε και κανένας από τους moderators ως τώρα στη συζήτηση. Διαπίστωσα όμως ότι τελικά η συζήτηση ξέφυγε και αρχίσαν να γίνονται επικίνδυνες προτάσεις, για ένα απλούστατο θέμα.

    Η λύση είναι επίσης απλή. Δεν υπάρχει κανένας απολύτως λόγος να χρησιμοποιήσει κανείς static μεθόδους ή πεδία, Close μέσα σε κουμπιά, κουμπιά μέσα σε Close, επιπέον κλάσεις, MDI φόρμες, παραπομπή σε WPF αντί για Winforms ή οτιδήποτε παραπέμπει σε rockect science.

    Μία φόρμα είναι απλά μία κλάση. Όταν εμφανίζεται μία φόρμα στο χρήστη απλά δημιουργείται ένα instance της κλάσης και εκτελείται ο κώδικας που θα ζωγραφίσει το UI στην οθόνη. Όπως με κάθε κλάση, αν θέλουμε να περάσουμε κάποιο reference σε άλλη κλάση είτε χρησιμοποιούμε κάποιο property στο οποίο θα θέσουμε το reference, είτε καλούμε κάποιο method στο οποίο περνάμε το reference ως παράμετρο. Επειδή τώρα η FormA και η FormB δεν ξέρουν η μία την άλλη, την ανταλλαγή references θα πρέπει να αναλάβει η main form, η φόρμα η οποία δημιουργεί τις άλλες.

    Από τη στιγμή που η μία φόρμα (FormA) έχει reference στην άλλη (FormB) μπορεί να καλέσει οποιαδήποτε public method της άλλης φόρμας. Μεταξύ αυτών και την Form.Close.

    Ακόμα καλύτερα βέβαια είναι να μήν ξέρει η μία φόρμα για την άλλη αλλά να επικοινωνούν μεταξύ τους μόνο μέσω της κυρίως φόρμας. H FormA σηκώνει ένα event το οποίο ακούει η MainForm και καλεί την FormB.Close

    Μία απλούστατη υλοποίηση είναι παρακάτω. Όπως βλέπετε οι δύο φόρμες δεν κάνουν ουσιαστικά τίποτε. Μόνο η FormA σηκώνει το CloseOtherForm event. Αλλά και η MainForm πάλι δεν κάνει κάτι ιδιαίτερο. Απλά καλεί την Close της FormB:

     public partial class MainForm : Form
        {
            public MainForm()
            {
                InitializeComponent();
            }
    
            FormA formA = new FormA();
            FormB formB = new FormB();
    
            private void MainForm_Load(object sender, EventArgs e)
            {
                formA.CloseOtherForm += new EventHandler(formA_CloseOtherForm);
    
                formA.Show();
                formB.Show();
            }
    
            void formA_CloseOtherForm(object sender, EventArgs e)
            {
                formB.Close();
            }
        }
    
    
        public partial class FormA : Form
        {
            public event EventHandler CloseOtherForm;
            
            public FormA()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                CloseOtherForm(this,new EventArgs());
            }
        }
    
    
    public partial class FormB : Form
        {
            public FormB()
            {
                InitializeComponent();
            }
        }
    }

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-06-2009, 15:19 51234 σε απάντηση της 51230

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

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

    Απλά ανέφερα το link προς βοήθεια των υπόλοιπων μελών.

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

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

    Ας μας αναφέρει κάποιος σε ποια ποστ συζητήθηκε εκτενέστερα το πρόβλημα αυτό.

    Ευχαριστώ.
  •  02-06-2009, 15:31 51235 σε απάντηση της 51234

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

    Το post του MSDN αφορά WPF, όχι Winforms


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-06-2009, 15:36 51236 σε απάντηση της 51235

    Απ: Κλήση συνάρτησης από ένα window σε άλλο

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