Autor Beitrag
jg72
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: Sa 17.12.11 23:51 
Hallo Zusammen,

ich habe eine eigene Klasse (implementiert das INotifyPropertyChanged Interface), die (abgespeckt) folgendermaßen aussieht:
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 22



BeitragVerfasst: 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