C# DatePicker StackOverFlowException

0

Witam

Nie znalazłem takiego problemu, to piszę. Jak już było to poruszane na forum to może źle szukałem.

Mam taki kawałek kodu:

        private void dpDatePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dpDatePicker1.SelectedDate.Value < DateTime.Now) dpDatePicker1.SelectedDate = DateTime.Now;
            tbTime1.Text = DateTime.Now.ToString("HH:mm");
        }
</Code>

W chwili gdy wartośćw dpDatePicker1.SelectedDate.Value < DateTime.Now, to próba przypisania dpDatePicker1.SelectedDate = DateTime.Now; kończy się błędem StackOverFlowException.
Tego błędu się nie da obsłużyć try .. catch. 

Pytanie więc co robię źle lub jak to obsłużyć by było poprawnie ?

Pozdrawiam wszystkich
0
  1. co chcesz zrobic (w sensie co chcesz osiagnac)
  2. skoro masz stackoverflow expcetion to znaczy ze wywolujesz pewnie jakas funkcje kilka razy i stos Ci sie przepelnia, zobacz callstack
0

Witam,
Ad. 1 Co chcę osiągnąć: Na formie ktoś podał datę. Ta data musi mieć spełniony warunek - nie może być mniejsza od dnia dzisiejszego, jeżeli jest co najmniej wczorajsza to bierze przypisuje datę i godzinę dzisiejszą. Ale na przypisaniu

  dpDatePicker1.SelectedDate = DateTime.Now;
</Code>
powoduje wyjątek...

Ad. 2 W typ przypadku - nie wywołuje wiele razy...   ale to jest możliwe...   Sprawdziłem - miałeś rację. Zdarzenie SelectedDateChanged się powtarzało przy każdej operacji przypisania
3

przecież to dpDatePicker1.SelectedDate = DateTime.Now wywołuje to dpDatePicker1_SelectedDateChanged a że przypisujesz datę i godzinę to masz dużą szansę, że pętla nigdy się nie skończy

0

Przed ustawieniem daty w dpDatePicker1_SelectedDateChanged odepnij to zdarzenie (operator -= jak sądzę), a potem je znowu przypnij.

0

Abrakadaber i somekind mają rację. A ja dorzucę jeszcze swoje trzy grosze. W zdarzeniu, które odpala się po zmianie daty, zmieniasz tą datę. Więc zdarzenie znowu się odpala (bo data została zmieniona). A Ty znowu zmieniasz datę, więc zdarzenie znowu się odpala i tak dalej. Aż w końcu zapełniasz cały stos tymi wywołaniami i dostajesz przepełnienie stosu (stack overflow). Rozwiązanie podane przez somekind wydaje się być dobre.
Powoduje, że zmiana daty w zdarzeniu, nie wywoła kolejny raz tego zdarzenia. Moim zdaniem nie jest to jednak rozwiązanie idealne. Ja bym te sprawdzenia przeniósł do jakiegoś zdarzenia typu OnBlur, czyli gdy kontrolka traci fokus. Wtedy nie dość, że możesz zmienić datę bez problemów, to możesz jeszcze pokazać jakiś komunikat, a nawet ustawić fokus na tej kontrolce. I to bez zabawy w chwilowe odpinanie zdarzeń. Wydaje mi się, że gdy musisz coś takiego zrobić, to musi być jakieś lepsze wyjście, nad którym zawsze warto się zastanowić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1