login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Waarom wordt Event (sub) op DateTimePicker tweemaal uitgevoerd??? (Opgelost)

Offline MaTh07 - 05/01/2008 19:48
Avatar van MaTh07Lid Hallo allemaal,

Kan er mij misschien iemand helpen met dit vreemde probleem?
Wanneer ik de datum van dtpVertrekdatum wijzig in een datum die eerder is dan deze van dtpDocumentDatum, dan krijg ik twee keer de foutmelding te zien.
Toen ik mijn programma stap voor stap heb overlopen, merkte ik dat na het doorlopen van het subprogramma "ControleerDatum" als event op dtpVertrekdatum, de intussen juist aangepaste datum van dtpVertrekdatum opnieuw op de foutieve waarde wordt gezet en daardoor het event opnieuw wordt uitgevoerd met als gevolg dat ik een tweede keer een foutmelding krijg.

Weet iemand waaraan dit zou kunnen liggen?
Of heeft er iemand een andere mogelijke oplossing voor dit probleem, zodat ik maar één keer een foutmelding krijg?

Ik heb mezelf al suf gezocht, maar ik ben dan ook een beginner .

Hier de code:

  1. Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
  2.  
  3. ControleerDatum(dtpVertrekdatum)
  4. End Sub
  5.  
  6.  
  7.  
  8. Public Sub ControleerDatum (ByVal teControlerenDatumControl As DateTimePicker, Optional ByVal controleDatumControl As DateTimePicker = Nothing)
  9.  
  10. Dim vglDatum As Date
  11. Dim message As String
  12.  
  13. If controleDatumControl IsNot Nothing Then
  14. vglDatum = controleDatumControl.Value.ToShortDateString
  15. message = "De gekozen datum kan niet eerder zijn dan " & controleDatumControl.Value.ToShortDateString
  16. Else
  17. vglDatum = frmAdmin.dtpDocumentDatum.Value.ToShortDateString
  18. message = "De gekozen datum is reeds verstreken"
  19. End If
  20.  
  21. If teControlerenDatumControl.Value < vglDatum Then
  22. MessageBox.Show(message, "Foute datumkeuze", MessageBoxButtons.OK, MessageBoxIcon.Error)
  23. teControlerenDatumControl.Value = vglDatum 'geeft dubbele foutmelding
  24. End If
  25.  
  26. End Sub


En hier de link naar het voorbeeldprogramma:
LINK

Alvast heel erg bedankt voor jullie hulp!


M@Th

4 antwoorden

Gesponsorde links
Offline Abbas - 05/01/2008 19:59 (laatste wijziging 05/01/2008 20:15)
Avatar van Abbas Gouden medaille

Crew .NET
Zal er eens naar kijken se! 

Zo dat was niet zo moeilijk. Allereerst klopt er al iets niet met de eerste IF. Als ik als datum heb 5/1/2008 en als vertrekdatum 8/1/2008 wordt "message": De gekozen datum is reeds verstreken.

Nu het gedeelte van die dubbele melding. Je hebt bijvoorbeeld een datum eerder dan de huidige datum. Raar genoeg, maar "message" wordt niet: De gekozen datum is reeds verstreken. Hij gaat naar het volgende stuk en daar vergelijk je weer. Deze keer goed en krijg je een melding met "Foute datumkeuze". Deze keuze is inderdaad fout al zou ik voor de duidelijkheid hier zetten: "Gekozen datum reeds verstreken!". En nu komen we er...

Je zet de teControlerenDatumControl.Value op de huidige datum, waardoor de waarde verandert. En omdat je een event hebt dat in werking schiet bij een verandering van de waarde gaat hij terug die functie in en krijg je de dubbele melding.

Zo, ik hoop dat je snapt waarom dit gebeurt. 
Offline MaTh07 - 05/01/2008 20:17 (laatste wijziging 05/01/2008 20:37)
Avatar van MaTh07 Lid Hartelijk bedankt voor je antwoord, maar naar mijn bescheiden mening zit daar het probleem niet.

Wat betreft de eerste if heb je gelijk, hier stond nog wat onnodige code. De aangepaste versie van de code en het programma (waar je het zelf kan testen) vind je onderaan.

Dat door het wijzigen van de datum, het event opnieuw in gang schiet begrijp ik, maar dit zou geen probleem mogen zijn, aangezien de datum nu gewijzigd is in een juiste datum (hier wordt dan ook geen foutmelding gegeven).
Als je het programma doorloopt met "Step Into" zal je echter merken dat na het event twee keer uit te voeren en de datum op de juiste waarde te zetten, om de een of andere onverklaarbare deze datum terug op de eerste foute waarde wordt gezet en daardoor het event opnieuw oproept met de bijkomende tweede foutmelding tot gevolg.

Volgens mij heeft dit iets te maken met het feit dat de datum gekozen wordt in een kalendertje, want als je de datum manueel mbv het toetsenbord wijzigt, dan krijg je mooi zoals het hoort slechts één foutmelding.

Weet jij als ervaren VB.Net'er hier misschien een oplossing voor?
Nogmaals hartelijk bedankt!


LINK NAAR PROGRAMMA

  1. Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
  2. ControleerDatum(dtpVertrekdatum)
  3. End Sub
  4.  
  5. Public Sub ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker) ', ByVal controleDatumControl As DateTimePicker)
  6.  
  7. Dim vglDatum As Date
  8. Dim message As String
  9.  
  10. vglDatum = dtpDocumentDatum.Value.ToShortDateString
  11. message = "De gekozen datum is reeds verstreken"
  12.  
  13. If teControlerenDatumControl.Value < vglDatum Then
  14. MessageBox.Show(message, "Foute datumkeuze", MessageBoxButtons.OK, MessageBoxIcon.Error)
  15. teControlerenDatumControl.Value = vglDatum
  16. End If
  17.  
  18. End Sub
Offline Abbas - 05/01/2008 21:28 (laatste wijziging 05/01/2008 21:51)
Avatar van Abbas Gouden medaille

Crew .NET
1. Ik ben geen heel ervaren VB.NET'er, het is vooral C# maar toch bedankt! 

2. Waarom zet je de message zoizo op "reeds verstreken"? Die message heb je trouwens niet nodig.

3. Natuurlijk gaat het maar 1x gegeven worden als je het met het toetsenbord wijzigt. Dan wordt het event niet opnieuw aangeroepen.

4. Ik heb een oplossing maar ben aan het eten nu. Ik post zo meteen de code. Ok, hier is ze:
  1. Public Class Form1
  2.  
  3. 'een boolean declareren en op false zetten
  4. 'moet hier staan!!!
  5. 'later volgt waarom deze nodig is
  6. Dim reset As Boolean = False
  7.  
  8. Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
  9.  
  10. 'maak van het resultaat van de function een boolean
  11. 'je geeft nu ook die boolean mee
  12. Dim flag As Boolean = ControleerDatum(dtpVertrekdatum, reset)
  13.  
  14. 'als het resultaat van de functie false is
  15. 'wil dus zeggen als de datum in het verleden was
  16. If flag = False Then
  17. 'die boolean op true zetten
  18. 'hierdoor zal de controle niet meer uitgevoerd worden
  19. 'en geen melding meer worden gegeven
  20. reset = True
  21. 'de waarde van de datetimepicker terugzetten
  22. dtpVertrekdatum.ResetText()
  23. End If
  24.  
  25. End Sub
  26.  
  27. 'ik heb er een functie van gemaakt in plaats van een sub
  28. 'een sub kan geen return-value geven
  29. Public Function ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker, ByVal bool As Boolean) ', ByVal controleDatumControl As DateTimePicker)
  30.  
  31. 'als de boolean false is
  32. If bool = False Then
  33.  
  34. 'datums in vars steken
  35. Dim vglDatum As Date = dtpDocumentDatum.Value.ToShortDateString
  36. Dim ctrlDatum As Date = teControlerenDatumControl.Value.ToShortDateString
  37.  
  38. 'als de datum in het verleden is
  39. If ctrlDatum < vglDatum Then
  40. 'foutmelding geven en false returnen
  41. MessageBox.Show("Gekozen datum is reeds verstreken.", "FOUT", MessageBoxButtons.OK, MessageBoxIcon.Error)
  42. Return False
  43. Else
  44. 'melding geven dat datum ok is en true returnen
  45. MessageBox.Show("Datum OK!", "Melding", MessageBoxButtons.OK, MessageBoxIcon.Information)
  46. Return True
  47. End If
  48. Else
  49.  
  50. 'als de boolean true was true returnen
  51. Return True
  52.  
  53. End If
  54.  
  55. End Function
  56.  
  57. End Class


Offline MaTh07 - 05/01/2008 22:22
Avatar van MaTh07 Lid Inderdaad, op deze manier werkt het!

Bedankt!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.196s