Databinding und TextChange einer RichTextBox

#1
Hi,

Kann es sein, dass das binding einer RichTextBox in einem separetem Thread abläuft?

richTextBox.DataBindings.Add("Text", dataBinding, "blablubbs")

Obwohl die Zuweisung noch im Konstruktor stattfindet, erhalte ich nach ablauf des Formular-Load-Events einen Aufruf von textChanged durch die RTB.
Alle anderen Elemente lösen noch vor dem Ablauf aus.
Daher vermute ich, dass das ganze im Hintergrund einen eigenen Thread hat.
Ist das so und kann ich auf den z.B. joinen?

Gruß
André
 

Spyke

Capoeirista
Premium-User
#2
Was genau willst du erreichen?
Was genau wird bei den anderen Controls ausgelöst?

Was mir jetzt bei deinem DataBinding Beispiel der RTF Box fehlt, ist der DataSourceMode.

Standard mäßig ist dieser glaube OnValidation, hast du ev. bei den anderen OnPropertyChanged gesetzt, weshalb dort schon eher irgendwas ausgelöst wird?
 
#3
Hallo Spyke,

der Plan war diverse Schaltelemente erst dann zu aktivieren, wenn z.B. eine textBox nach dem öffnen Text enthält.
Bei einem anderen Formular habe ich dieses Problem nicht. Das Anbinden der DataSource unterscheidet sich nicht wesentlich von meinem Problemformular.
DataSourceMode habe ich bisher noch nicht verwendet.
 
#4
So, es funktioniert.
Warum ist mir allerdings nicht klar. Ich habe an dem Formular nichts geändert!!
Das bestärkt mich in dem Verdacht dass das laden der Daten über das DataBinding in einem eigene Thread läuft und beunruhigt mich in soweit, dass ich noch nicht sehe was ich mit dem problem machen WENN es wieder auftritt.
 

Spyke

Capoeirista
Premium-User
#5
Hier nur mal ein paar Beobachtungen die ich während der Datenbindung so machte, vielleicht hilfts ja bissl das problem einzugrenzen.

Meinst du mit aktivieren das du auch die Enabled und/oder ReadOnly Eigenschaften auch daten gebunden machst?
Wenn solltest du bedenken das die dort gebundene Eigenschaft nur einen getter haben sollte.

Die Datenbindung der Windows Controls wird auch erst wirklich "angestartet" wenn die Controls komplett geladen wurden.
(Ev. sogar sichtbar sind, bin mir da gerade nicht sicher, zumindest sollte Handle erstellt sein).
Sprich zum beispiel direkt in einem Konstruktor einer Form zu erwarten das eine Bindung läuft sollte nicht funktionieren, da wird eigentlich erstmal noch nixs ausgeführt.

Wird bindingSource.DataSource auf null gesetzt werden auch automatisch alle DataBinding hinterlegungen der Controls welches auf diese bindungSource verweisen entfernt.

Und falls du die DataBindings per hand setzt.
Zuerst bindingSource.BeginEdit() aufrufen und zum schluss nach der DataBindings zuweisung der Controls EndEdit().
(Ich glaube mich zu erinnern das auch nicht unbedingt immer sofort ne Exception kahm wenn man dies nicht machte)

Ma ne grobe zusammenfassung
 
#6
Nein, die enabled Eigenschaft ist nicht datengebunden. Da habe ich einfach Simple, z.B. den Speichern-Button, auf enabled = false gesetzt. Wenn jemand den Text der TextBox ändert, soll er dann aktiviert werden.
Diese TextChanged und co werden aber auch ausgelöst, wenn das Formular geladen wird; die Elemente erhalten ja den Text, und zwar über das DataBinding.

Die Datenbindung der Windows Controls wird auch erst wirklich "angestartet" wenn die Controls komplett geladen wurden.
(Ev. sogar sichtbar sind, bin mir da gerade nicht sicher, zumindest sollte Handle erstellt sein).
Sprich zum beispiel direkt in einem Konstruktor einer Form zu erwarten das eine Bindung läuft sollte nicht funktionieren, da wird eigentlich erstmal noch nixs ausgeführt.


Das dachte ich mir auch, habe jedoch keinen Unterschied feststellen können, ob ich das DataBinding im Konstruktor oder im FormularLoad durchführe.

Bisher habe ich vor den setzen noch nie beginEdit() aufgerufen. Ich werde es mal im Auge behalten wie sich das verhält, danke.
 
#7
So richtig weiter bin ich noch nicht (ausser dass der Fehler wieder da ist)

Ich habe mal eine Ausgabe in der TextChanged und der load gemacht. Ein mal im Problem-Formular und ein mal in dem Formular wo es geht.

Im Formular wo es geht sieht die Ausgabe nach Aufruf so aus (immer):

Textgeändert: rtb1
Textgeändert: tb1
Textgeändert: tb2
Textgeändert: tb3
load ende


Die Ausgabe des Problemformulars (immer):

Textgeändert: rtb1
Textgeändert: rtb2
Textgeändert: tb1
Textgeändert: tb2
Textgeändert: tb3
load ende
Textgeändert: rtb1
Textgeändert: rtb2


woher das 2te TextChanged kommt weiß ich noch nicht.
 

Spyke

Capoeirista
Premium-User
#8
lass dir mal den StackTrace im TextChanged im Debug ausgeben, ev. kommste so dem aufrufer näher.

Hat ev. deine Klasse INotifyPropertyChanged gesetzt und das PropertyChanged Ereignis wird aus irgendnem Grund ausgelöst?

Aber lass dir mal StackTrace ausgeben und/oder BreakPoint und dann schau dir mal den CallStack an.