2009-11-02 5 views
8

Nie otrzymuję zachowania, którego oczekiwałbym od obiektu TextBox powiązanego z właściwością całkowitą w obiekcie biznesowym.Anulowanie sprawdzania poprawności zdarzenia kontroli danych nie blokuje próby zaktualizowania źródła danych

Oto co zrobiłem:

(1) Ustaw DataSourceUpdateMode dla TextBox do: OnValidation.

(2) W zdarzeniu dla TextBox, ustaw e.Cancel = True, jeśli wartość Integer.TryParse nie powiedzie się.

(3) Dodaj handler'a do Binding.Parse i Binding.BindingComplete i umieść punkty przerwania w modułach obsługi.

Uruchom aplikację, umieść "asdasd" w polu tekstowym i na karcie. Mimo ustawienia e.Cancel = True, oba zdarzenia: Parse i BindingComplete. Zgodnie z dokumentacją ustawienie e.Cancel = True powinno powstrzymać dalszą logikę.

Szukałem MSDN, aby dowiedzieć się, dlaczego tak się dzieje, ale nie mogę znaleźć niczego. Czy ktoś wie, gdzie mogę podać szczegółowe informacje?

ETA: Dodałem również uchwyt do zdarzenia Walidowane. Oto sekwencja zdarzeń:

Bad dane:

(1) zatwierdzanie. (Ustawić e.Cancel = True)

(2) Przetwarza

(3) BindingComplete

dobre dane:

(1) Weryfikacja

(2) Przetwarza

(3) BindingComplete

(4) Zatwierdzony

ETA2: Trochę więcej informacji i obejść.

Problem z tym zachowaniem polega na sprawdzeniu poprawności, która nie jest zaimplementowana w ustawieniu właściwości.

Na przykład, powiedzmy, że moja właściwość całkowita musi być liczbą nieparzystą. Nie sprawdzam tego w ustawieniach własności, więc sprawdzam w zdarzeniu walidującym.

Jak widać, z powyższego zachowania wartość, jako poprawna liczba całkowita, zostanie zapisana w źródle danych, nawet jeśli anuluję sprawdzanie poprawności.

Mimo że źródło danych zostało zaktualizowane, jeśli ustawisz Anuluj w zdarzeniu walidującym, zdarzenie Sprawdzane nie zostanie uruchomione, więc nadal możesz uniemożliwić postęp użytkownika.

obejście ::

Aby zatrzymać aktualizacji źródła danych, trzeba zweryfikować w przypadku Binding.Parse, a wyjątek - co zapobiega wiązaniu ukończenie pomyślnie.

+0

dobre znalezisko. [Wygląda jak błąd WinForm] [1]. [1]: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=490267 –

+0

Pozdrawiam, zgodziłem się na błąd i dodałem pracę. – Jules

Odpowiedz

1

Dodaje wywołanie do AnulujEdyt wydaje się robić różnicę.

private void textBox1_Validating(object sender, CancelEventArgs e) 
    { 
     bindingSource1.CancelEdit(); 
     e.Cancel = true; 
    } 
+0

Następnym razem sprawdzę, w którym roku zostało zamieszczone pytanie .... – helgeheldre

Powiązane problemy