Entwickler-Ecke

WinForms - Problem mit Databinding TextBox vs. Klasse


jg72 - Sa 17.12.11 23:51
Titel: Problem mit Databinding TextBox vs. Klasse
Hallo Zusammen,

ich habe eine eigene Klasse (implementiert das INotifyPropertyChanged Interface), die (abgespeckt) folgendermaßen aussieht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
class Test : INotifyPropertyChanged
{
    public string Property
    {
        get { ... }
        set { ... }
    }

    public bool Property_Valid
    {
        get { return Property.Length > 0; }
    }

    ...
}


Nun binde ich die Eigenschaft an eine Textbox

C#-Quelltext
1:
textBoxProperty.DataBindings.Add("Text", test, "Property"false, DataSourceUpdateMode.OnPropertyChanged);                    


Dies funktioniert auch alles soweit.

Dann fange ich das TextChanged-Ereignis der Textbox ab und versuche dort mit Hilfe der Property_Valid-Eigenschaft festzustellen, ob Property auch einen gültigen Wert hat.

Leider "hinkt" der Wert der Eigenschaft Property etwas hinterher. Steht in der Textbox irgend ein Text drin, den ich dann markiere und komplett lösche, ist in dem TextChanged-Ereignis noch der alte Text drin, weshalb die Überprüfung fehl schlägt.

Ich könnte mir nun eine Methode in die Klasse basteln, welche einen Text auf entsprechende Gültigkeit überprüft und diese dann im Ereigis mit textBoxProperty.Text füttern, aber das mag mir so nicht gefallen.

Gibt es da noch andere Möglichkeiten? Evtl. ein anderes Ereignis, welches etwas später gesendet wird?

Vielen Dank schonmal im Vorraus,
jg72

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Th69 - So 18.12.11 12:03

Hallo jg72,

wie du schon selber gesehen hast, sind DataBinding und eigene controlbezogene Ereignisse nicht so einfach miteinander benutzbar.

Ich würde einfach eine statische Methode in deiner Klasse anbieten, welche einen Wert auf Gültigkeit prüft, z.B.

C#-Quelltext
1:
2:
3:
4:
public static bool IsTextValid(string text)
{
    return text.Length > 0;
}

und diese dann von TextBoxChanged sowie von deiner Property_Valid-Eigenschaft aufrufen (sofern es komplizierter als Length > 0 ist ;-))

Aber eigentlich sollte es ja so sein, daß der Property-Setter die Validität überprüfen sollte (zumindestens zusätzlich) und dann evtl. eine Exception werfen.

Schau dir aber auch mal die Validating und Validated-Ereignisse (bei den Controls) sowie den ErrorProvider an...


jg72 - So 18.12.11 12:40

Hallo,

das mit Validating und Co. ist mir schon klar.

Was ich erreichen will ist:

Der Benutzer sieht mehrere TextBoxen. Dort kann er dann seien Daten angeben. Bisher war es dann so, dass beim Speichern der Daten dann eine Fehlermeldung kam, wenn fehlerhafte Daten eingegeben wurden. Dabei kann die Entscheidung, ob ein bestimmter Wert gültig ist auch schonmal etwas komplexer sein.

Nun soll es in Zukunft so sein, dass direkt bei der Eingabe die fehlerhaften TextBoxen per veränderter Hintergrundfarbe erkennbar sind, so dass man direkt beim Tippen die Fehler bemerkt. Dies sollte (wenn möglich) nicht erst beim Validieren geschehen.

Eine andere Möglichkeit, die mir noch einfällt, wäre eine Eigenschaft in der Klasse, die die Hintergrundfarbe zurückliefert, abhängig davon, ob der Wert gültig ist oder nicht. Wenn ich die BackColor-Eigenschaft der Textbox daran binde, sollte es ja funktionieren. Dies gefällt mir aber auch nicht.

Das mit der (statischen) Methode zur Validierung hatte ich mir auch schon überlegt. Dies mag mir aber auch nicht gefallen. Irgend etwas sagt mir, dass es auf meinem ursprünglichen Weg doch auch eine Lösung geben müsste.

Viele Grüße,
jg72


jg72 - Mo 19.12.11 10:41

Hallo,

letzte Nacht kam mir dann die Erkenntnis. Keine Ahnung, ob das so optimal gelöst ist, aber für mich reicht es:

Ich habe eine neue Klasse von TextBox abgeleitet. Dieser habe ich eine Eigenschaft Valid spendiert, durch welche das mit dem Hintergrund geregelt wird und binde diese Eigenschaft an die Property_Valid Eigenschaft meiner Daten-Klasse.

Viele Grüße,
jg72