{"id":55000116,"date":"2018-02-01T00:00:00","date_gmt":"2020-03-27T19:30:04","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=116"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Das_DatePickerSteuerelement","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Das_DatePickerSteuerelement\/","title":{"rendered":"Das DatePicker-Steuerelement"},"content":{"rendered":"<p><b>F&uuml;r die Eingabe von Datumsangaben gibt es unter WPF ein spezielles Steuer-element &#8211; das sogenannte DatePicker-Control. Es ist recht schlicht gehalten, bietet aber eine gute und zuverl&auml;ssige M&ouml;glichkeit, Datumsangaben schnell auszuw&auml;hlen. Da es ein spezialisiertes Steuer-element ist, offeriert es jedoch auch einige individuelle Attribute, die Sie kennen sollten, um das Element effizient zu nutzen. Anderenfalls kommt es schnell zu Problemen &#8230;<\/b><\/p>\n<p>In einer Datenbankanwendung ist die Wahrscheinlichkeit sehr hoch, dass Sie fr&uuml;her oder sp&auml;ter Datumsangaben eingeben m&uuml;ssen. Unter Access wurde f&uuml;r Felder, die auf einem Datumsfeld basierten, ein Textfeld angelegt, das beim Fokuserhalt eine Schaltfl&auml;che zum &Ouml;ffnen eines kleinen Popups zur Datumsauswahl pr&auml;sentierte. Bei dem <b>DatePicker<\/b>-Steuerelement von WPF ist diese kleine Schaltfl&auml;che immer sichtbar, sodass der Benutzer direkt wei&szlig;, dass er bei der Datumseingabe Unterst&uuml;tzung findet. Ein <b>DatePicker<\/b>-Element ist schnell hinzuf&uuml;gt &#8211; entweder &uuml;ber die ToolBox, wo es unter <b>Alle WPF-Steuerelemente <\/b>zu finden ist oder durch das Hinzuf&uuml;gen eines neuen Elements des Typs <b>DatePicker <\/b>zum XAML-Code &#8211; im einfachsten Fall wie folgt:<\/p>\n<pre>&lt;DatePicker \/&gt;<\/pre>\n<p>Das Steuer-element sieht dann im Entwurf wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_01\/pic_116_001.png\" alt=\"Das DatePicker-Element in der Entwurfsansicht\" width=\"424,7115\" height=\"234,4131\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Das DatePicker-Element in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Wenn Sie die Anwendung starten, liefert das <b>DatePicker<\/b>-Steuerelement den Text <b>Datum ausw&auml;hlen<\/b>. Ein Klick auf die Schaltfl&auml;che rechts neben dem Eingabefeld zeigt dann ein Popup mit der Ansicht des aktuellen Monats an (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_01\/pic_116_002.png\" alt=\"Das DatePicker-Element in Aktion\" width=\"424,7115\" height=\"307,7966\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das DatePicker-Element in Aktion<\/span><\/b><\/p>\n<h2>Besondere Eigenschaften des DatePicker-Elements<\/h2>\n<p>Das <b>DatePicker<\/b>-Element liefert einige Eigenschaften, die f&uuml;r die Programmierung interessant sind.<\/p>\n<ul>\n<li><b>SelectedDateChanged<\/b>: Diese Ereignis wird ausgel&ouml;st, wenn sich der Wert des Datums &auml;ndert.<\/li>\n<li><b>IsDropDownOpen<\/b>: Gibt den aktuellen Zustand des Kalender-Popups wieder und erlaubt auch die Einstellung der Eigenschaft.<\/li>\n<li><b>SelectedDateFormat<\/b>: Gibt das angezeigte Datumsformat aus.<\/li>\n<li><b>CalendarOpened<\/b>: Wird ausgel&ouml;st, wenn der Kalender ge&ouml;ffnet wird.<\/li>\n<li><b>CalendarClosed<\/b>: Wird ausgel&ouml;st, wenn der Kalender geschlossen wird.<\/li>\n<li><b>DateValidationError<\/b>: Wird ausgel&ouml;st, wenn ein ung&uuml;ltiges Datum eingegeben wird.<\/li>\n<\/ul>\n<h2>Ereignis beim &Auml;ndern des Datums<\/h2>\n<p>Wenn der Benutzer das Datum im <b>DatePicker<\/b>-Element anpasst, l&ouml;st er damit das Ereignis <b>SelectedDateChanged <\/b>aus, welches wir mit der folgenden Methode implementieren k&ouml;nnen. Das neue Datum wird dann in einem Meldungsfenster angezeigt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>dpDatepicker_SelectedDateChanged(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>SelectionChangedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>datePicker<span style=\"color:blue;\"> As Date<\/span>Picker\r\n     datePicker = sender\r\n     MessageBox.Show(\"Das neue Datum lautet: \" + datePicker.Text)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Zuvor legen wir das Attribut f&uuml;r das <b>DatePicker<\/b>-Element wie folgt an:<\/p>\n<pre>&lt;DatePicker x:Name=\"dpDatepicker\" SelectedDateChanged=\"DatePicker_SelectedDateChanged\"&gt;&lt;\/DatePicker&gt;<\/pre>\n<h2>Datumsformat ermitteln<\/h2>\n<p>Die <b>MessageBox<\/b> der obigen Ereignismethode k&ouml;nnen wir noch erweitern. Sie soll nun auch noch das Format des angezeigten Datums ausgeben:<\/p>\n<pre>MessageBox.Show(\"Das neue Datum lautet: \" + datePicker.Text + <span style=\"color:blue;\">vbCrLf<\/span> + \"und hat das Format: \" + datePicker.SelectedDateFormat.ToString)<\/pre>\n<p>M&ouml;gliche Werte sind <b>Short <\/b>und <b>Long<\/b> &#8211; hier mit Beispielen:<\/p>\n<ul>\n<li><b>Short<\/b>: <b>15.02.2018<\/b><\/li>\n<li><b>Long<\/b>: <b>Donnerstag, 15. Februar 2018<\/b><\/li>\n<\/ul>\n<h2>Kalender per Code aufklappen<\/h2>\n<p>Vielleicht m&ouml;chten Sie den Kalender automatisch aufklappen &#8211; zum Beispiel, wenn sich das Fenster &ouml;ffnet oder wenn der Benutzer ein ung&uuml;ltiges Datum eingegeben hat. Dann k&ouml;nnen Sie die Eigenschaft <b>IsDropDownOpen <\/b>nutzen. Diese liefert sowohl den aktuellen Zustand als auch die M&ouml;glichkeit, den Zustand durch Zuweisen eines <b>Boolean<\/b>-Wertes zu &auml;ndern. Die Schaltfl&auml;che, die wir im Fenster neben dem <b>DatePicker <\/b>untergebracht haben, macht genau das &#8211; sie klappt den Kalender auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnKalenderAnzeigen_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     dpCatepicker.IsDropDownOpen = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Ereignisse bei &Ouml;ffnen und Schlie&szlig;en des Kalenders<\/h2>\n<p>Die beiden Ereignisse <b>CalendarOpened <\/b>und <b>CalendarClosed <\/b>werden ausgel&ouml;st, wenn der Kalender angezeigt oder ausgeblendet wird. Sie werden wie folgt zum Element hinzugef&uuml;gt:<\/p>\n<pre>&lt;DatePicker x:Name=\"dpDatepicker\" SelectedDateChanged=\"dpDatepicker_SelectedDateChanged\" CalendarOpened=\"dpDatepicker_CalendarOpened\" CalendarClosed=\"dpDatepicker_CalendarClosed\"&gt;&lt;\/DatePicker&gt;<\/pre>\n<p>Die beiden Ereignisse programmieren wir wie folgt, um den aktuellen Zustand des Kalenders im Ausgabe-Bereich auszugeben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>dpDatepicker_CalendarOpened(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     Debug.WriteLine(\"Der Kalender wurde ge&ouml;ffnet.\")\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>dpDatepicker_CalendarClosed(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     Debug.WriteLine(\"Der Kalender wurde geschlossen.\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Ung&uuml;ltige Eingaben abfangen<\/h2>\n<p>Wenn Sie in der Standardkonfiguration ein ung&uuml;ltiges Datum wie etwa <b>30.2.2018 <\/b>eingeben, wird das Textfeld ohne Kommentar wieder geleert. Das &uuml;berhaupt etwas geschieht, erfahren Sie im Ausgabe-Bereich &#8211; hier erscheint die folgende Meldung:<\/p>\n<pre>Ausnahme ausgel&ouml;st: \"System.FormatException\" in mscorlib.dll<\/pre>\n<p>Diese Ausnahme k&ouml;nnen Sie mit einer herk&ouml;mmlichen Fehlerbehandlung (<b>Try&#8230;Catch<\/b>) nicht abfangen. Allerdings bietet das <b>DatePicker<\/b>-Element eine eigene Ereignismethode an, um auf solche Fehleingaben zu reagieren, und zwar das Ereignis <b>DateValidationError<\/b>:<\/p>\n<pre>&lt;DatePicker x:Name=\"dpDatepicker\" ... DateValidationError=\"dpDatepicker_DateValidationError\"&gt;&lt;\/DatePicker&gt;<\/pre>\n<p>Mit der ersten Version der Ereignismethode zeigen wir nur die Fehlerart an, in diesem Fall <b>System.FormatException<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>dpDatepicker_DateValidationError(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As Date<\/span>PickerDateValidationErrorEventArgs)\r\n     MessageBox.Show(\"Fehler: \" + e.Exception.GetType.ToString)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000116\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000116?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000116\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F&uuml;r die Eingabe von Datumsangaben gibt es unter WPF ein spezielles Steuer-element &#8211; das sogenannte DatePicker-Control. Es ist recht schlicht gehalten, bietet aber eine gute und zuverl&auml;ssige M&ouml;glichkeit, Datumsangaben schnell auszuw&auml;hlen. Da es ein spezialisiertes Steuer-element ist, offeriert es jedoch auch einige individuelle Attribute, die Sie kennen sollten, um das Element effizient zu nutzen. Anderenfalls kommt es schnell zu Problemen &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012018,662018,44000025,44000028,44000015],"tags":[],"yst_prominent_words":[],"class_list":["post-55000116","post","type-post","status-publish","format-standard","hentry","category-66012018","category-662018","category-VBAProgrammierung","category-Word_programmieren","category-WPFSteuerelemente"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000116"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000116\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000116"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}