2009-12-24 8 views
10

Mam formularz z kilkoma polami tekstowymi i innymi elementami sterującymi. Używam kontroli errorprovider i podłączyłem poprawkę do zdarzenia sprawdzania poprawności w każdym polu tekstowym, który muszę zweryfikować. Zdarzenie sprawdzania poprawności ma miejsce, gdy kontrola daje fokus do innej kontrolki. Tak więc zdarzenie ma miejsce, gdy używasz klawisza tabulatora, aby odejść od bieżącej kontrolki lub po kliknięciu innej kontrolki za pomocą myszy 1. I uważam, że to bardzo denerwujące, aby podać przykład, jeśli otworzę ten winForm, a następnie natychmiast spróbuję go zamknąć, to nie pozwoli mi, ponieważ walidacja spowoduje, że pierwszy tekst nie zawiera żadnego tekstu.Sprawdzanie poprawności kilku pól tekstowych na formularzu okna C# w tym samym czasie

Zachowanie, którego chcę, to używanie dostawcy błędów, jak mogę sprawdzić poprawność całego formularza tylko po kliknięciu przycisku Zapisz formularza?

Dzięki

+0

+1 Nienawidzę tego również – albertein

Odpowiedz

10

Sprawdź właściwość Form.AutoValidate.

Możliwe wartości:

  • wyłączyć

niejawny walidacja nie nastąpi. Ustawienie tej wartości nie będzie zakłócać jawnych wywołań do Validate lub ValidateChildren.

  • EnablePreventFocusChange

niejawny walidacja występuje, gdy kontrola traci ostrość.

  • EnableAllowFocusChange

niejawny walidacja nastąpi, ale jeśli walidacja nie powiedzie się, będzie koncentrować się nadal zmiany do nowej regulacji. Jeśli sprawdzanie poprawności nie powiedzie się, walidowane zdarzenie nie zostanie wywołane.

Ustawienie tego na EnableAllowFocusChange rozwiąże problem otwierania formularza i natychmiast spróbuje go zamknąć, ponieważ fokus zostanie przeniesiony do przycisku Anuluj.

Jeśli chcesz uzyskać pełną kontrolę nad sprawdzaniem poprawności, możesz ustawić ją na Disable i przeprowadzić ręczną weryfikację przy użyciu Form.Validate i Form.ValidateChildren. Nie jestem w 100% pewny, ale uważam, że Form.ValidateChildren nie wywoła zdarzeń walidacji dla kontrolek umieszczonych wewnątrz TabControl.

+0

To pomaga znacznie, dzięki. – Edwin

0

Nie ma żadnego sposobu, aby uzyskać WinForms do sprawdzania kontroli uratować. W przeciwieństwie do formularza internetowego, nie ma żadnego zdarzenia "prześlij" lub "zapisz" (przynajmniej nie w formularzu). Możesz zaprogramować formularz, aby zachowywał się w ten sposób, ale nie będziesz mógł korzystać z powiązania danych (Save ustawi model i sprawdzi błędy).

Być może lepszym rozwiązaniem jest nie używanie okna dialogowego do pokazywania błędów (zakładam, że jesteś, ponieważ mówisz, że to problem z zamknięciem formularza). Etykietki narzędzi mogą zapewnić lepsze wrażenia użytkownika. Jeśli użytkownik zignoruje podpowiedzi, możesz podać okno dialogowe po naciśnięciu Zapisz. Będą mogli zamknąć formularz, nawet jeśli są złe dane.

0

Ustaw właściwość CausesValidation we wszystkich elementach sterujących (z wyjątkiem przycisku Zapisz) na False. Spowoduje to wyłączenie zdarzenia sprawdzania poprawności dla wszystkich elementów sterujących za wyjątkiem przycisku. Może nie być to dokładnie to, czego chcesz, ponieważ denerwujące zachowanie stanie się po zmianie fokusa na przycisku, ale jest blisko tego, co chcesz, myślę.

Inną opcją, jeśli to nie zadziała, to do pętli poprzez kontrole po kliknięciu przycisku i zatwierdź je ręcznie jeden po drugim ...

Oto link MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx

1

Tylko po to, aby zachować tę aktualizację, ponieważ João Angelo powiedział, że Form.ValidateChildren() nie uruchomi sprawdzania poprawności kontroli wewnątrz, powiedzmy, GroupBox lub TabControl.

Można jednak przekazać ValidationContraints do przeciążonej ValidateChildren(ValidationConstraints) metody i ustawić go na None, który: „Sprawdza wszystkie kontrolki dziecka, a wszystkie dzieci z tych kontroli dzieci, niezależnie od ich ustawień właściwości”

Powiązane problemy