C# Eigenschaft eines Steuerelements ändern und anzeigen

Terminator2

Erfahrenes Mitglied
Hallo,

Eigentlich ist es ja kein Problem, den Wert einer ProgressBar zu ändern. Jedenfalls hatte ich in VB damit keine Probleme. In C# muss ich jetzt wiederholt feststellen, dass die Werte einfach nicht angezeigt werden... Wenn ich den Wert mit einer MessageBox ausgebe, klappt es. Was muss ich denn machen, damit die geänderte Eigenschaft auf dem Bildschirm sichtbar wird?

Erst einmal der Aufruf der Form:
Code:
frmAlarmLevel.Instance.ShowLevel();

Und hier der gesamte Code des Fensters frmAlarmLevel:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace motion
{
    public partial class frmAlarmLevel : Form
    {
        public static frmAlarmLevel Instance;

        public frmAlarmLevel()
        {
            frmAlarmLevel.Instance = this;
            InitializeComponent();
        }

        public void ShowLevel()
        {
            //MessageBox.Show(MainForm.Instance.AlarmWindow.Count.ToString());
            if (MainForm.Instance.AlarmWindow.Count > 0) 
            { 
                pBarWin1.Value = (int)MainForm.Instance.AlarmWindow[0].AlarmLevel;
                pWin1.Text = MainForm.Instance.AlarmWindow[0].AlarmLevel.ToString();
            }
            //...
        }

    }
}

Das Fenster öffne ich folgendermaßen:
Code:
        private void button1_Click(object sender, EventArgs e)
        {
            frmAlarmLevel form = new frmAlarmLevel();
            form.Show();
        }

Ich hoffe, damit könnt Ihr was anfangen. Da muss nichts besonderes passieren. Das Fenster soll nur einmal einfach geöffnet werden und dort dann die Werte angezeigt werden. Es sieht aber alles leider etwas eingefrohren aus :(

Gruß und Danke!
 
Hallo,

der gepostete Code sollte so funktionieren. Wo wird denn "frmAlarmLevel.Instance.ShowLevel();" aufgerufen? Falls das im Hauptthread innerhalb einer Schleife passiert, kann die GUI nicht aktualisiert werden.

Gruß
MCoder
 
Hey,

Habe in der Zwischenzeit weitergeforscht.
Du hast Recht, genau das ist das Problem. Die GUI wird blockiert von dem Hauptthread, der den Prozessor zu 100% auslastet.
Jetzt habe ich mich zwar schon informiert, wie das so in etwa gemacht werden müsste, ich bekomme es aber leider nicht hin.
Was müsste ich denn jetzt in diesem Code speziell ändern, damit die GUI durch diesen Invoke Befehl?! doch funktioniert?
Es müssen wirklich nur diese Werte in den Steuerelementen angezeigt werden.
Button-Klicks etc. funktionieren ja weiterhin...


Gruß David
 
Hallo,

die schnelle aber unschöne Möglichkeit wäre, in der Schleife ein "Application.DoEvents()" einzubauen, damit anstehende Messages, wie etwa das Aktualisieren eines Controls, verarbeitet werden.

Wenn du es richtig machen willst, lagere die Aktion in einen BackgroundWorker aus und aktualisiere die ProgressBar über den ProgressChanged-Event.

Gruß
MCoder
 
Die Methode mit dem DoEvents kannte ich schonmal von einem ähnlichen Problem.
Habe das daher auch versucht, hat aber leidet nicht geklappt. Muss das DoEvents vielleicht an einer anderen Stelle einfügen...
Werde mich aber mal mit dem Background Worker beschäftigen :)
 
Ich hatte das in eine der Schleifen eingebaut, in denen ich das Bild bearbeitet hab.
Das Projekt ist schon recht komplex, deswegen wäre das mit dem Background Worker nicht so einfach denke ich, vor allem weil diese Aufgaben Form- und Klassen-übergreifend sind. Habe mir die Erläuterung dazu bei msdn angeschaut und finde das viel zu aufwendig, nur für die paar Steuerelemente...

Ich habe mal ausprobiert, es mit einem EventHandler zu lösen. Das scheint zu klappen :) Habe dann noch die Anzeige-Prozedur möglichst optimiert, sodass die Anzeige den Rechner nicht aufhalten sollte.

Den DoEvents Befehl brauchte ich dann auch nicht.


Gruß David
 
Zurück