Laden...

Textbox Datenbinding editieren

Erstellt von kuppi vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.540 Views
Thema geschlossen
K
kuppi Themenstarter:in
44 Beiträge seit 2006
vor 11 Jahren
Textbox Datenbinding editieren

Hallo zusammen,

ich habe ein (kleines?) Problem mit Datenbindung an einer Textbox.

Folgendes habe ich gemacht: (Ansteuerung eines Rührers)

ein Object mit 3 Int Eigenschaften Drehzahl, Drehmoment, Solldrehzahl ist an
2 Labels (Drehzahl und Drehmoment) und eine Textbox (Solldrehzahl) gebunden.
Die Events werden über NotifyChange aufgerufen, funktioniert einwandfrei, die Werte werden alle angezeigt.

Jetzt das Problem:

Es kommen laufen neue Werte (bis auf Solldrehzahl) an (ca. 2-3 /sek.), wenn ich dann versuche die Solldrehzahl zu ändern (editieren der Textbox) wird sowie z.B. ein neuer Drehzahlwert im Label erschein der ursprüngliche Wert der Solldrehzahl wieder in der Textbox angezeigt.
Wenn kein Update von Drehzahl/Drehmoment erfolgt kann ich die Solldrehzahl editieren.

Lässt sich diese verhalten ändern, der Solldrehzahl Int im Objekt hat sich ja nicht geändert, das Event wird auch nicht aufgerufen.

Ich hoffe auf euch.

Gruß Jürgen

1.696 Beiträge seit 2006
vor 11 Jahren

Jetzt das Problem:

Es kommen laufen neue Werte (bis auf Solldrehzahl) an (ca. 2-3 /sek.), wenn ich dann versuche die Solldrehzahl zu ändern (editieren der Textbox) wird sowie z.B. ein neuer Drehzahlwert im Label erschein der ursprüngliche Wert der Solldrehzahl wieder in der Textbox angezeigt.
Wenn kein Update von Drehzahl/Drehmoment erfolgt kann ich die Solldrehzahl editieren.

Lässt sich diese verhalten ändern, der Solldrehzahl Int im Objekt hat sich ja nicht geändert, das Event wird auch nicht aufgerufen.

Sorry, ich verstehe überhaupt nicht was du meinst, könntest du nochmlas erklären?

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo kuppi,

aktualisierst du die Werte/Objekte aus einem anderen Thread als dem GUI-Thread? Das darfst du nicht, wenn bzw. da sie gebunden sind, siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

herbiviore

K
kuppi Themenstarter:in
44 Beiträge seit 2006
vor 11 Jahren

Hallo,

sorry wenn ich mich da unklar ausgedrückt haben sollte.

es ist tatsächlich so, dass ich die objekteigenschaften von einem anderen Thread gesetzt werden, und dementsprechend auch das PropertyChange Ereignis.
Aber ich lege diese Aufrufe als Action in eine "SyncQueue, (Herbivore sei Dank!), und leere die über einen Timer im GUI.
Ich habe mal gelesen dass es reichen würde wenn eine PropertyChange aufgerufen wird, das alle gebundenen Controls aktualisiert werden.

Beispiel:

Drehzahl ändert sich, PropertyChange für Drehzahl wird aufgerufen, aber alle 3 Bindungen Drehzahl, Drehmoment und Solldrehzahl werden aktualisiert.

In der Praxis sieht das so aus:

in der Textbox steht 275 als aktuelle Solldrehzahl, es kommen im Label laufend Drehzahlen von 274 bis 276 an, in dem anderen Label die Werte fürs Drehmoment.
Jetzt "geh ich in die Textbox", und will auf 325 ändern.
Ich habe z.B. gerade angefangen den Textboxinhalt von rechts (Backspace) abzuräumen, da wird wieder das Label mit einer neuen Drehzahl aktualisiert und sofort erscheint auch in der Textbox der ursprüngliche Wert von 275 (die Solldrehzal aus dem Quellobjekt).

Ich hoffe es ist jetzt etwas klarer.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo kuppi,

es ist tatsächlich so, dass ich die objekteigenschaften von einem anderen Thread gesetzt werden, und dementsprechend auch das PropertyChange Ereignis.

wenn das tatsächlich so ist, ist es falsch.

Aber ich lege diese Aufrufe als Action in eine "SyncQueue, (Herbivore sei Dank!), und leere die über einen Timer im GUI.

Die Aufrufe von PropertyChanged? Du müsstest die Aufforderung, die Werte zu ändern, in die SyncQueue legen und die Änderung der Werte im GUI-Thread durchführen.

herbivore

K
kuppi Themenstarter:in
44 Beiträge seit 2006
vor 11 Jahren

Hallo,

hier ist mal ein Stück Quellcode:

hier werden die Aufrufe aus dem nicht GUI Thread in die Queue gelegt.

protected virtual void NotifyPropertyChanged(string propname)
        {
            if (PropertyChanged == null) return;
            PropertyChangedEventHandler handler = PropertyChanged;
            Action action = () => handler(this, new PropertyChangedEventArgs(propname));
            GUIobj.GUIpropChange.Enqueue(action); // SyncQueue
            // diese Queue wird dann vom GUI-Thread geleert.
        }


Und hier wird im GUI-Thread die Queue geleert.

private void tmr_msg_Tick(object sender, EventArgs e)
        {
            tmr_msg.Enabled = false;
            if (GUIobj.GUIpropChange.Count > 0) GUIobj.GUIpropChange.Dequeue()();
            tmr_msg.Enabled = true;
        }

Und so lege ich die Bindings an:

private void Form1_Shown(object sender, EventArgs e)
        {
            ruehrer = (vm_ruehrerIKA)GUIobj.Get_vmObject(5, 2);
            label1.DataBindings.Add("Text", ruehrer, "Drehzahl");
            label2.DataBindings.Add("Text", ruehrer, "Drehmoment", true, DataSourceUpdateMode.Never, null, "#0.0");
            textBox1.DataBindings.Add("Text", ruehrer, "Solldrehzahl", false, DataSourceUpdateMode.OnValidation, null);
        }

Gruß Jürgen

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo kuppi,

wie gesagt, bereits die Datenänderung muss im GUI-Thread erfolgen. Im NotifyPropertyChanged ist es zu spät, irgendwas an den GUI-Thread zu delegieren. Das steht aber alles schon weiter oben bzw. in der FAQ.

herbivore

Thema geschlossen