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 .
Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
ControleerDatum(dtpVertrekdatum)
End Sub
Public Sub ControleerDatum (ByVal teControlerenDatumControl As DateTimePicker, Optional ByVal controleDatumControl As DateTimePicker = Nothing)
Dim vglDatum As Date
Dim message As String
If controleDatumControl IsNot Nothing Then
vglDatum = controleDatumControl.Value.ToShortDateString
message = "De gekozen datum kan niet eerder zijn dan " & controleDatumControl.Value.ToShortDateString
Else
vglDatum = frmAdmin.dtpDocumentDatum.Value.ToShortDateString
message = "De gekozen datum is reeds verstreken"
End If
If teControlerenDatumControl.Value < vglDatum Then
MessageBox.Show(message, "Foute datumkeuze", MessageBoxButtons.OK, MessageBoxIcon.Error)
teControlerenDatumControl.Value = vglDatum 'geeft dubbele foutmelding
End If
End Sub
PrivateSub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles dtpVertrekdatum.ValueChanged
ControleerDatum(dtpVertrekdatum)
EndSub
PublicSub ControleerDatum (ByVal teControlerenDatumControl As DateTimePicker, OptionalByVal controleDatumControl As DateTimePicker =Nothing)
Abbas - 05/01/2008 19:59 (laatste wijziging 05/01/2008 20:15)
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.
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!
Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
ControleerDatum(dtpVertrekdatum)
End Sub
Public Sub ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker) ', ByVal controleDatumControl As DateTimePicker)
Dim vglDatum As Date
Dim message As String
vglDatum = dtpDocumentDatum.Value.ToShortDateString
message = "De gekozen datum is reeds verstreken"
If teControlerenDatumControl.Value < vglDatum Then
MessageBox.Show(message, "Foute datumkeuze", MessageBoxButtons.OK, MessageBoxIcon.Error)
teControlerenDatumControl.Value = vglDatum
End If
End Sub
PrivateSub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles dtpVertrekdatum.ValueChanged
ControleerDatum(dtpVertrekdatum)
EndSub
PublicSub ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker)', ByVal controleDatumControl As DateTimePicker)
Public Class Form1
'een boolean declareren en op false zetten
'moet hier staan!!!
'later volgt waarom deze nodig is
Dim reset As Boolean = False
Private Sub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtpVertrekdatum.ValueChanged
'maak van het resultaat van de function een boolean
'je geeft nu ook die boolean mee
Dim flag As Boolean = ControleerDatum(dtpVertrekdatum, reset)
'als het resultaat van de functie false is
'wil dus zeggen als de datum in het verleden was
If flag = False Then
'die boolean op true zetten
'hierdoor zal de controle niet meer uitgevoerd worden
'en geen melding meer worden gegeven
reset = True
'de waarde van de datetimepicker terugzetten
dtpVertrekdatum.ResetText()
End If
End Sub
'ik heb er een functie van gemaakt in plaats van een sub
'een sub kan geen return-value geven
Public Function ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker, ByVal bool As Boolean) ', ByVal controleDatumControl As DateTimePicker)
'als de boolean false is
If bool = False Then
'datums in vars steken
Dim vglDatum As Date = dtpDocumentDatum.Value.ToShortDateString
Dim ctrlDatum As Date = teControlerenDatumControl.Value.ToShortDateString
'als de datum in het verleden is
If ctrlDatum < vglDatum Then
'foutmelding geven en false returnen
MessageBox.Show("Gekozen datum is reeds verstreken.", "FOUT", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
Else
'melding geven dat datum ok is en true returnen
MessageBox.Show("Datum OK!", "Melding", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return True
End If
Else
'als de boolean true was true returnen
Return True
End If
End Function
End Class
PublicClass Form1
'een boolean declareren en op false zetten
'moet hier staan!!!
'later volgt waarom deze nodig is
DimresetAsBoolean=False
PrivateSub dtpVertrekdatum_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles dtpVertrekdatum.ValueChanged
'maak van het resultaat van de function een boolean
'je geeft nu ook die boolean mee
Dim flag AsBoolean= ControleerDatum(dtpVertrekdatum, reset)
'als het resultaat van de functie false is
'wil dus zeggen als de datum in het verleden was
If flag =FalseThen
'die boolean op true zetten
'hierdoor zal de controle niet meer uitgevoerd worden
'en geen melding meer worden gegeven
reset=True
'de waarde van de datetimepicker terugzetten
dtpVertrekdatum.ResetText()
EndIf
EndSub
'ik heb er een functie van gemaakt in plaats van een sub
'een sub kan geen return-value geven
PublicFunction ControleerDatum(ByVal teControlerenDatumControl As DateTimePicker, ByVal bool AsBoolean)', ByVal controleDatumControl As DateTimePicker)
'als de boolean false is
If bool =FalseThen
'datums in vars steken
Dim vglDatum AsDate= dtpDocumentDatum.Value.ToShortDateString
Dim ctrlDatum AsDate= teControlerenDatumControl.Value.ToShortDateString
'als de datum in het verleden is
If ctrlDatum < vglDatum Then
'foutmelding geven en false returnen
MessageBox.Show("Gekozen datum is reeds verstreken.", "FOUT", MessageBoxButtons.OK, MessageBoxIcon.Error)