Warunek sprawdzający datę wykonywany dwa razy

0

Witam Was

W zdarzeniu DateTimePicker1ValueChanged wstawiłem instrukcję sprawdzającą datę, która wymusza ustawienie daty minimum 2 tygodnie wstecz. Wygląda ona jak niżej:

		void DateTimePicker1ValueChanged(object sender, EventArgs e)
		{
			if (dateTimePicker1.Value.Date > (DateTime.Today).AddDays(-14))
			{
				dateTimePicker1.Value = (DateTime.Today).AddDays(-14);
				MessageBox.Show("Musisz wybrać datę początkową conajmniej 14 dni wstecz");
			}
		}

Problemem jest to że jeżeli wstawię datę np 13 lub mniej dni, komunikat wyświetlany jest dwukrotnie. Wydaje mi się że pierwsza linia w instrukcji warunkowej wywołuje ponownie zdarzenie DateTimePicker1ValueChanged, ale po ustawieniu daty instrukcja warunkowa w drugim zdarzeniu powinna mieć wartość false i ciało wewnątrz pętli nie powinno być wykonywane. Drugi komunikat jest wywoływany drugiej linii w instrukcji warunkowej pierwotnego zdarzenia.

Jak tą sytuację poprawnie rozwiązać ?

0
dateTimePicker1.ValueChanged -= DateTimePicker1ValueChanged;
dateTimePicker1.Value = cośtam;
dateTimePicker1.ValueChanged += DateTimePicker1ValueChanged;
0

O tym również myślałem, wstawiłem na początku i końcu bloku instrukcji w bloku if, ale też jest ten problem

		if (dateTimePicker1.Value.Date > (DateTime.Today).AddDays(-14))
			{
				dateTimePicker1.ValueChanged -= DateTimePicker1ValueChanged;
				dateTimePicker1.Value = (DateTime.Today).AddDays(-14);
				MessageBox.Show("Musisz wybrać datę początkową conajmniej 14 dni wstecz");
				dateTimePicker1.ValueChanged += DateTimePicker1ValueChanged;
			} 

Jest to wywołane przez zdarzenie, po przypisaniu nowej wartości zgodnej z linią, w której ponowne sprawdzenie warunku daje rezultat false, nie powinno wywoływać tego co jest w ciele instrukcji warunkowej. Jeśli tak nie jest oznaczałoby to że instrukcja jeszcze nie przypisała nowej wartości (DateTime.Today).AddDays(-14). Przed instrukcją próbowałem również odświeżyć DateTimePicker1, również bez efektu.

0

Wkleiłem dokładnie twój kod (ten pierwszy, bez wyłaczania zdarzenia) i komunikat pojawia się raz.
Powiedz jaką masz wersję frameworka i visual studio.

0

Piszę w SharpDevelop wersja 4.2, mam zainstalowanego 3,5 oraz 4.0. W ustawieniach projektu zmieniłem na framework 3.5, tak aby paczka mogła pracować na komputerach bez instalowania fameworka (zakładam że większość komputerów już mam system win7, więc standardowo mają framework 3.5)

Otworzyłem go w Microsoft Visual C# i również jest to samo po skompilowaniu, nie widzę nigdzie podwójnego wywołania zdarzenia - kompletnie nie wiem o co chodzi.

W czym bym nie tworzył, SharpDevelop czy Visual C# 2010, framework 4 i 3.5 - za każdym razem nowe projekty zawierające tylko dateTimePicker, ale efekt ten sam.

0

Wrzuć gdzieś taki projekt do ściągnięcia (może być jako załącznik do posta tu na forum) bo próbowałem pod .NET 2.0 i 4.5 i nie widzę tego problemu.

0

Proszę, w załączniku mój projekt stworzony dla testu, wstawiłem tylko dateTimePicker, zdarzenie ValueChanged dla dateTime Picker oraz zdarzenie Form1_Load ustawiające datę dziś -14 dni.

Po wprowadzeniu na przykład daty dzisiejszej czy wczorajszej informacja wyświetlana jest dwa razy. Po pierwszym zaakceptowaniu informacji okno komunikatu wyświetla się drugi raz.

Program stworzyłem w Visual C# 2010.

0

Coś jest nie w porządku z moim frameworkiem lub systemem, przerzuciłem na drugi komputer aplikację i uruchomiłem - działa normalnie.

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