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

 

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

Status bar problem

Îåêßíçóå áðü ôï ìÝëïò pk78. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 30-05-2007, 01:01. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-05-2007, 15:30 32276

    Status bar problem

     Καλησπέρα,
    Έχω το εξής πρόβλημα, σε μια εφαρμογή σε C#. H κύρια φόρμα της εφαρμογής είναι η Form1, η οποία περιέχει διάφορα controls όπως ένα status bar στο οποίο θέλω να εμφανίζονται διάφορες πληροφορίες καθόλη τη διάρκεια εκτέλεσης του προγράμματος. Από την  Form1, καλώ έπειτα διάφορα dialog boxes ( Form2, Form3...). Πώς μπορώ να έχω πρόσβαση στο status bar(sbInfo) της Form1, από κάποια άλλη φόρμα?
    Από την Form2 δημιουργώ ένα instance της Form1 και αλλάζω το
    private System.Windows.Forms.StatusBar sbInfo σε public αλλά δεν μπορώ να εμφανίσω τίποτα στο status bar.
    Τι κάνω λάθος? Υπάρχει κάποιος άλλος τρόπος να γίνει αυτό?

    Ευχαριστώ
  •  28-05-2007, 16:44 32277 σε απάντηση της 32276

    Απ: Status bar problem

    Καλησπέρα pk78,

    Αυθέρετα θεωρώ οτι η Form1 ειναι IsMDIContainer, αρα εχουμε 3 λύσεις που μου ερχονται στο μυαλό:

    Ο Μπακάλης:

       Περνεις το MDIParent της Form2 το κάνεις mask σαν τύπου Form1 και αλλαζεις της τιμές στην StatusBar.

          e.g. ((Form1)this.MDIParent).myStatusBar.Text = "some text";

    Ο Επιμελής Μπακάλης:

       Περνεις το MDIParent της Form2 και με reflection αλλαζεις την StatusBar.

          e.g. this.MDIParent.GetType().GetProperty("StatusBar1").GetProperty("Text").SetValue("some Text");

             Edited: Η Παραπάνω γραμμή ειναι λαθος, δες απο το Help πως θα παρεις την StatusBar και το property που θέλεις να αλλάξεις.

             PS. Εδώ ΠΡΕΠΕΙ την StatusBar να την έχεις ως Public Property στην Form1.

    Ο Σωστός:

       Κανεις μια φόρμα που όλες οι Child φόρμες θα κάνουν Inherit απο αυτήν και θα έχει ένα Event (ChangeStatusText (MyTextEventArgs)) και κάθε φορά που θα ανόιγεις μία Child φόρμα, θα κάνεις Subscribe στο event μέσα στην Form1

          e.g.

                Inside the Base Form:

                   public EventHandler<MyTextEventArgs> StatusBarChanged;

                Inside the Form1:

                   Form2 f = new Form2();

                   f.StatusBarChanged += new EventHandler(YourEventMethod);

                Inside the Child Form:

                   if (this.StatusBarChanged != null)

                      this.StatusBarChanged(this,MyTextEventArgs1);

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

    Νασος


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  28-05-2007, 17:45 32278 σε απάντηση της 32277

    Απ: Status bar problem

    Νάσσο, γιατί όλη αυτή η φασαρία? Από τη στιγμή που έχεις ένα instance της Form1, αφού εσύ τη δημιούργησες, μπορείς να πειράξεις άμεσα τα public property της. Οι απαιτήσεις για MDI, το inheritance, το reflection είναι περιττά. Το μόνο που χρειάζεται είναι να έχεις κάνει public το status bar από το designer της φόρμας.

    Παρόλα αυτά, το να πειράζεις απευθείας τα control μίας φόρμας από μία άλλη θεωρείται χείριστη τακτική. Ο λόγος είναι ότι έτσι "δένονται" οι δύο φόρμες και μία απλή αλλαγή όπως η μετονομασία του status bar θα δημιουργήσει προβλήματα. Το καλύτερο θα ήταν να φτιάξεις ένα property στην πρώτη φόρμα, π.χ. PercentComplete του οποίου η τιμή θα περνά απευθείας στο status bar.

    Στη Form1 προσθέτεις:

    Public int PercentComplete
    {
    get{ return this.progressBar1.Value;}
    set{ this.progressBar1.Value=value;}
    }

    Και στη Form2 καλείς:

    Form1 aForm=new Form1();
    ...
    aForm.PercentComplete=34;
    ...


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-05-2007, 18:05 32280 σε απάντηση της 32278

    Απ: Status bar problem

    Φίλε Παναγίωτη,

    ορμόμενος απο το παρακάτω θεώρησα οτι ειναι MDI.

    pk78:

    Από την  Form1, καλώ έπειτα διάφορα dialog boxes ( Form2, Form3...).

    Ερώτηση γιατι μπορει εγώ να μην κατάλαβα τη ακριβώς λες, πως γίνετε να έχεις ενα Instance της Form1 f1a,από εκεί μέσα να ανοίξεις ένα Instance της Form2 f2a, και μέσα απο την νέα φορμα να κανεις νέο Instance της Form1 f1b, και ουσιαστικά να αλλάζεις το Πρώτο Instance (f1a)?

    pk78:

    Από την Form2 δημιουργώ ένα instance της Form1 και αλλάζω το
    private System.Windows.Forms.StatusBar sbInfo σε public αλλά δεν μπορώ να εμφανίσω τίποτα στο status bar

    Νασος

     


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  28-05-2007, 18:19 32283 σε απάντηση της 32280

    Απ: Status bar problem

    Χμμμ, η ερώτηση είναι αρκετά μπερδεμένη έτσι κι αλλιώς, οπότε πρέπει να μαντέψει κανείς τί συμβαίνει. Δεν είχα καταλάβει ότι η νέα φόρμα θέλει να πειράξει την πρώτη φόρμα. Πάντως, δεν είναι απαραίτητο να δημιουργήσει κανείς MDI φόρμες για να μιλησει η parent με την Child, μπορείς άνετα να περάσεις την parent φόρμα ως παράμετρο στον constructor της νέας φόρμας, ή σε κάποιο property της νέας φόρμας. Η ιδέα του event είναι ίσως καλύτερη, να βάλεις δηλαδή ένα Progress event στη νέα φόρμα που θα ειδοποιεί την πρώτη ότι έγιναν αλλαγές.

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


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-05-2007, 18:26 32284 σε απάντηση της 32283

    Απ: Status bar problem

    Spot-on Παναγίωτη,

    Γι'αυτόν τον λόγο, Ονομασα την λύση με το Event ως "Σωστος" γιατί είναι ο μόνος που δεν συνδέει άμεσα της Φόρμες (Decoupling).

    Nassos


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  29-05-2007, 23:14 32324 σε απάντηση της 32284

    Απ: Status bar problem

    Καλησπέρα,
    Να αναδιατυπώσω το πρόβλημα..Είμαι καινούριος στο .ΝΕΤ οπότε ίσως η σκέψη μου δεν είναι καλή..
    Η εφαρμογή περιέχει τις φόρμες Form1, FormDeviceOperation και FormDeviceMessage.

    Έστω Form1 η βασική φόρμα της εφαρμογής, η οποία περιέχει ένα status bar sbInfo. O designer της Form1 λοιπόν περιέχει το :
    private System.Windows.Forms.StatusBar sbInfo;

    Καλώ ένα dialog box(FormDeviceOperation)  από την Form1:
    Form FrmDeviceOperation = new FormDeviceOperation();
    FrmDeviceOperation.ShowDialog();

    Έπειτα από την FormDeviceOperation καλώ ένα δεύτερο dialog box (FormDeviceMessage):
    Form FrmDeviceMessage = new FormDeviceMessage();
    FrmDeviceMessage.ShowDialog();

    Αυτό που θέλω είναι όταν βρίσκομαι πχ στο 2ο dialog box επειδή εκτελούνται κάποιες λειτουργίες, να ενημερώνεται αυτόματα το status bar της Form1.
    Δοκίμασα τη λύση του Παναγιώτη  και δεν γίνεται τιποτα :(
    Θα δοκιμάσω και τη λύση του Nάσου και θα ενημερώσω...Ελπίζω να ήταν πιο σαφές το προβλημά μου πάντως

    ΧΚ
  •  30-05-2007, 01:01 32326 σε απάντηση της 32324

    Απ: Status bar problem

    Λογικό να μην δούλεψε αυτό που έγραψα, καθώς νόμιζα ότι το status bar ήταν στη δεύτερη φόρμα. Για αυτό που προσπαθείς να κάνεις, καλύτερα είναι να σηκώνεις events, έτσι ώστε να μην εξαρτώνται οι άλλες φόρμες από την κύρια.

    Όμως το UI που θα δημιουργήσεις θα είναι άσχημο και μπερδεμένο. Αφού οι λειτουργίες γίνονται στην τρίτη φόρμα, γιατί να επηρεάζεται η πρώτη? Και το UI θα είναι μπλεγμένο, αλλά και θα χρειαστείς κάμποσο κώδικα για να το πετύχεις. Δεν αρκεί να σηκώσει η τρίτη φόρμα ένα event, η δεύτερη θα πρέπει να το πιάσει και να το ξανασηκώσει, και μετά να το πιάσει η πρώτη φόρμα για να ανανεώσει το progress bar. Βάλε καλύτερα ένα progress bar στην τρίτη φόρμα, έτσι ώστε να μην χρειάζεται να επικοινωνεί με τις άλλες.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems