Announcement

Collapse
No announcement yet.

Progressbar über zwei Forms

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Progressbar über zwei Forms

    Hallo zusammen!

    Ich bin in der C#-Welt noch relativ neu...
    Ich versuche mich gerade daran, eine Progressbar über zwei forms hinweg zu steuern. Ziel ist es, das Programm auf einem Laptop laufen zu lassen, und auf einem zweiten Monitor soll eine zweite Progressbar mit den Werten der ersten innerhalb des zweiten Forms weiterlaufen. Insgesamt ist es ein Punktesystem.
    Ich füge mal zwei Screenshots dazu ein, damit man sich darunter besser was vorstellen kann.
    Mein Problem derzeit ist, dass die Statusleiste auf dem Präsentationsform nicht aktualisiert wird.
    Wenn ich am Ende des Sourcecodes this.show() einfüge, dann wird ein neues Form geöffnet, in dem auch die Progressbars richtig angezeigt(mit Fortschritt) werden, aber es werden halt neue Fenster geöffnet. Mit this.refresh(), this.update() und this.invalidate() funktioniert es leider auch nicht.

    Nun folgt noch ein wenig code:

    Dies ist für die Übergabe für die erste PG.

    Code:
    int _GetmaxPunkte = 252;
    
                    gesamtPunkteTableAdapter1.Platzverteilung();
    
                    Praesi formPraesi = new Praesi();
    
                    int _PosXTN = 270;
                    int _PosXPKT = 430;
    
                    progressBar1.Maximum = _GetmaxPunkte;
                    progressBar1.Value = int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).GesamtPunkte.ToString());                
                    progressBar1.Location = new Point(int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosX.ToString())
                        , int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString()));
                    lbtn1PB.Location = new Point(_PosXTN,int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString())+4);
                    lbtn1PB.Visible = true;
    
                    lbP1.Visible = true;
                    lbP1.Text = gesamtPunkteTableAdapter1.GetData().FindByTID(1).GesamtPunkte.ToString() + " Punkte";
                    lbP1.Location = new Point(_PosXPKT, int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString()) + 4);
    
                    formPraesi.Progressbar_Load(int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).GesamtPunkte.ToString()),1);
    Und hier ist die Übergabe in das Form "Praesi" für PG1:

    Code:
     public void Progressbar_Load(int _ProgValue, int _TN)
            {
    
                int _GetmaxPunkte = 252;
                int _PosXTN = 270;
                int _PosXPKT = 430;            
              
    
                if (_TN == 1)
                {
                    progressBar1.Maximum = _GetmaxPunkte;
                    progressBar1.Value = _ProgValue;                
                    progressBar1.Location = new Point(int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosX.ToString())
                        , int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString()));
                    lbtn1PB.Location = new Point(_PosXTN, int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString()) + 4);                
                    lbtn1PB.Visible = true;
    
                    lbP1.Visible = true;
                    lbP1.Text = gesamtPunkteTableAdapter1.GetData().FindByTID(1).GesamtPunkte.ToString() + " Punkte";
                    lbP1.Location = new Point(_PosXPKT, int.Parse(gesamtPunkteTableAdapter1.GetData().FindByTID(1).PosY.ToString()) + 4);
               
                }
    Wie kann ich nun die Präsentationsanzeige aktualisieren? Oder ist der Weg über Progressbars der Falsche?

    Im voraus schon einmal vielen Dank!

    Gruß

    Stefan
    Attached Files

  • #2
    Wird das obige Codefragment jedesmal komplett ausgeführt? Weil

    Code:
    Praesi formPraesi = new Praesi();
    du auch jedesmal diese andere neue Form erzeugst. Wenn du die selbe Form immer nur updaten willst solltest du formPraesi auch nur 1 mal erzeugen und nicht n*mal.

    Comment


    • #3
      Das Codefragment befindet sich in der Click-Methode auf Form1. Also wird

      Praesi formPraesi = new Praesi();
      immer beim Klicken erzeugt.

      Comment


      • #4
        Form wirft Event. Die Shell subscribed event und leitets an die Progress Form weiter. Alternativ kann man auch ein Messaging System dazwischen bauen

        Comment


        • #5
          Okay.... Wie ich anfangs schon sagte, ich bin noch recht neu im C#-Bereich

          Hast du da vielleicht ein Beispiel für mich?

          Gruß

          Stefan

          Comment


          • #6
            hmmm das müsst ich jetzt zusammensuchen....

            [highlight=c#]
            public class StatusEventArgs:EventArgs
            {
            public int Status { get; set; }

            //Standard Konstruktor für EventArgs
            //...
            }

            public class Shell: Form
            {
            private Form1 _form1;
            private FormPraesi _formPraesi;

            public Shell()
            {
            _form1 = new Form1();
            _form1.OnStatusChanged += Form1StatusChanged;
            }

            private void Form1StatusChanged(Object sener, StatusEventArgs e)
            {
            _form1Praesi.SetzeStatus(e.Status);
            }
            }

            public class FormPraesi: Form
            {
            public void SetzeStatus(int status)
            {
            progressBar.Position = status;
            }
            }

            public class Form1:Form
            {
            public event EventHandler<StatusEventArgs> StatusChanged;

            protected void OnStatusChanged(int Status)
            {
            if(StatusChanged != null)
            StatusChanged(this, new StatusEventArgs() { Status = Status }));
            }
            public void FunktionDieStatusÄndert()
            {
            var neuerStatus = //Hole den geänderten Status
            OnStatusChanged(neueStatus);
            }

            }
            [/highlight]

            Damit hast Du die beiden Forms schon mal entkoppelt. SetzeStatus kann evtl. auch noch this.Update() aufrufen, dann wird die Form normalerweise sicher neu gezeichnet.

            Das ist jetzt natürlcih nur Beispielcode aber ich hoffe du verstehst was ich meine.

            Wenn Du mehrere Status brauchst, dann kannst Du den StatusEventArgs auch noch eine Property hinzufügen (z.B. Platz).

            Comment


            • #7
              Cool, Danke!
              Werde es nachher mal ausprobieren und dann noch mal posten, ob es so funktioniert hat.

              Comment


              • #8
                Mh, hat auch nicht so recht funktioniert....
                Da kommt bei mir jetzt der Fehler:
                Der Zugriff auf ...OnStatusChanged(int) ist aufgrund der Sicherheitsebene nicht möglich.
                Wie kann ich die Sicherheitsebene steuern? Oder gibt es grundsätzlich noch eine andere Möglichkeit?
                Gruß
                Stefan

                Comment


                • #9
                  Sorry diese Zeile in der Shell muss natürlich so sein:

                  Code:
                  alt:
                  _form1.OnStatusChanged += Form1StatusChanged;
                  
                  neu:
                  _form1.StatusChanged += Form1StatusChanged;

                  Comment


                  • #10
                    Auch nicht.
                    Vielleicht jetzt noch einmal eine blöde Frage... Muss ich für diesen Code eine neue Classe anlegen, oder schreib ich das in den Coden von Form1?

                    public void SetzeStatus(int status)
                    {
                    progressBar.Position = status;
                    }
                    Da kennt er "ProgressBar" nicht

                    public void FunktionDieStatusÄndert()
                    {
                    var neuerStatus = //Hole den geänderten Status
                    OnStatusChanged(neuerStatus);
                    }
                    Und dort wird (neuerStatus) angemeckert.

                    Comment


                    • #11
                      Hmmm... ich glaub ich hab das Problem missverstanden. Ich dachte Du wolltest einfach nur die Werte von von Form1 nach FormPreasi schaufeln, aber das bekommst Du wohl hin.

                      Ich glaub ich weiss was das Problem ist

                      Nimm mal

                      Praesi formPraesi = new Praesi();

                      aus Deiner Funktion. Und mache in Deiner Form1 ein Feld:

                      public class Form1: Form
                      {
                      private FormPraesi _formPraesi = new FormPraesi();
                      }

                      ansonsten den Code ganz normal weiter aufrufen. Im OnLoad der Form1 musst Du natürlich _formPraesi noch anzeigen. So wie Du das verwendest wird die FormPraesi der Du die Daten übergibst niemals angezeigt.
                      Irgendwo muss auf jeden Fall _formPraesi.Show() stehen.

                      Comment


                      • #12
                        Ok, werde das gleich mal versuchen.
                        P.S. die Form an sich soll vom User erst einmal geöffnet werden, über "Ansicht --> Präsentation" und dann manuell mit der Maus auf die Beameranzeige geschoben werden. Das geht soweit auch wenn der User darauf klickt. dafür hab ich anfangs folgenden code:

                        private void präsentationToolStripMenuItem_Click(object sender, EventArgs e)
                        {
                        Praesi formPraesi = new Praesi();
                        formPraesi.Show();
                        }
                        Mein "Problem" liegt dann "nur" bei der Aktualisierung der Progressbars.
                        Die werte werden schon richtig übergeben, wie du gerade bereits gesagt hast. Das hab ich mit dem Debugger verfolgen können.
                        Sorry, wenn ich mich ein wenig unklar ausgedrückt habt, vielleicht versteht Visual Studio einfach nicht, was ich meine, oder was ich will

                        Comment


                        • #13
                          Du musst trotzdem aus der formPraesi ein Feld machen wie in meinem Beispiel von grad eben

                          Comment


                          • #14
                            Yeah!!
                            Es klappt!!
                            Vielen vielen Dank!

                            Aber das war bestimmt nicht mein letzter Beitrag

                            Comment


                            • #15
                              Ralf Jansen hatte das eigentlich auch schon geschrieben Vielen Dank auch an ihn!

                              Comment

                              Working...
                              X