Calender Control, SelectionMode=MultiplyRange

  • WPF

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    @Akanel Mir ist durchaus bewusst, dass @Nofear23m hier explizit von einem Attached Property gesprochen hatte, aber, und bitte korrigiert mich wenn ich falsch liege es geht doch darum, das man eine Property in seinem ViewModel, mit den im CalendarControl ausgewählten Datetimes füllen möchte, und soweit ich den Artikel unter dem von mir geposteten Link aktuell verstehe, ermöglicht diese methode doch eine ReadOnly-Property (Das wäre ja vom Calendar die "SelectedDates" ) trotzden zu binden ? Wie gesagt so versteh ich das aktuell und es ist durchaus möglich das ich komplett falsch liege.

    LG


    Nachtrag:

    Und C# Code kann man problemlos durch einen Konverter jagen um ihn dann zu verstehen.


    kenne bisher leider keinen bei dem ich komplette Projektmappen einfach konvertieren kann ?

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Ich bin mir mittlerweile auch garnicht mehr sicher ob hier ein Attached Prperty überhaupt hilft, denn ich will ja nicht vom ViewModel Daten an die View schicken sondern anders rum. User selektiert mehrere Datumse, Dirse sollen dann an mein Property geschickt werden und niemals andersrum. Im ViewModel werden diese Datumse nur in einer ForEach Schleife benötigt. Bei meinen Tests wurde auch nie das Attached Property erreicht, immer nur dann wenn ich im ViewModel der Property händisch daten hinzugefügt habe. Deshalb hab ich jetzt einfach im CodeBehind über das Event mein Property gefüllt.
    Im Netz gab es auch ein Beispiel, allerdings für die BlackOutDates, kommt aber aufs selbe raus. Aber auch dort wurden die Datumse im ViewModel hinzugefügt.

    P.S. Ich guck mir den Link dennoch morgen mal genauer an
    "Hier könnte Ihre Werbung stehen..."
    Ich bin im Moment im Stress und werde erdt morgen dazu kommen ein Beispiel zu erstellen. Aber es ist egal in welche Rochtung man die Daten benötigt. Du benötigst egal in welche Richtung ein Property. Wenn du es nur in Richtung ViewModel benötigst um dort zu wissen welche Datumsrange selektiert wurde kannst du ja das vorhandene Property nutzen da in diesem Fall ja ein ReadOnly Property reicht. Musst du es eben OneWayToSource binden. Zumindest wenn ich das richtig verstehe.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Habe es nun folgendermaßen versucht und funktioniert zumindest ( bitte keine haue, ist aufgrund von Faulheit beim testen ohne extra ViewModel gemacht):


    MainWindow-Xaml:
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:AttachedPropTest"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800" DataContext="{Binding RelativeSource={RelativeSource Self}}">
    9. <Grid>
    10. <StackPanel>
    11. <local:CalendarEX SelectionMode="MultipleRange" SelectedDateMirror="{Binding SelectedDatesVM, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"></local:CalendarEX>
    12. <Button Click="Button_Click">test</Button>
    13. </StackPanel>
    14. </Grid>
    15. </Window>


    MainWindow-CodeBehind:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Collections.ObjectModel
    2. Imports System.ComponentModel
    3. Imports System.Runtime.CompilerServices
    4. Class MainWindow
    5. Implements INotifyPropertyChanged
    6. Private _selecteddatesvm As New ObservableCollection(Of DateTime)
    7. Public Property SelectedDatesVM() As ObservableCollection(Of DateTime)
    8. Get
    9. Return _selecteddatesvm
    10. End Get
    11. Set(ByVal value As ObservableCollection(Of DateTime))
    12. _selecteddatesvm = value
    13. RaisePropertyChanged()
    14. End Set
    15. End Property
    16. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    17. For Each dt As DateTime In SelectedDatesVM
    18. MessageBox.Show(dt.ToLongDateString)
    19. Next
    20. End Sub
    21. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    22. Protected Overridable Sub RaisePropertyChanged(<CallerMemberName> Optional ByVal prop As String = "")
    23. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    24. End Sub
    25. End Class


    und CalendarEX-Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Runtime.CompilerServices
    3. Public Class CalendarEX
    4. Inherits Calendar
    5. Public Property SelectedDateMirror As IEnumerable(Of DateTime)
    6. Get
    7. Return GetValue(SelectedDateMirrorProperty)
    8. End Get
    9. Set(ByVal value As IEnumerable(Of DateTime))
    10. SetValue(SelectedDateMirrorProperty, value)
    11. End Set
    12. End Property
    13. Public Shared ReadOnly SelectedDateMirrorProperty As DependencyProperty =
    14. DependencyProperty.Register("SelectedDateMirror",
    15. GetType(IEnumerable(Of DateTime)), GetType(CalendarEX),
    16. New PropertyMetadata(Nothing))
    17. Private Sub CalendarEX_SelectedDatesChanged(sender As Object, e As SelectionChangedEventArgs) Handles Me.SelectedDatesChanged
    18. SelectedDateMirror = Me.SelectedDates
    19. End Sub
    20. End Class
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,
    @asusdk Danke Dir für Deinen Test.
    Ich hab nochmal ein neues Projekt erstellt und es dort ausgetestet.
    Mit einer Extra Kalenderklasse wie oben kallpt es mit einem DependencyProperty. Mit einem AttachedProperty klappt es nicht...
    Ich musste allerdings etwas die Calenderklasse anpassen. Da ich von Calendar ableite, kann man die entsprechenden Events ja überschreiben.
    Klappt bestens.

    XAML:

    XML-Quellcode

    1. <Window x:Class="CalendarSample2.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:CalendarSample2"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="Auto"/>
    12. <RowDefinition Height="*"/>
    13. </Grid.RowDefinitions>
    14. <local:CalendarEx Grid.Row="0"
    15. SelectionMode="MultipleRange"
    16. SelectedDate="{Binding SelectedDate}"
    17. SelectedDatesEx="{Binding SelectedDates, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
    18. <ListView Grid.Row="1"
    19. ItemsSource="{Binding SelectedDates}"/>
    20. </Grid>
    21. </Window>


    Xaml.cs:

    C#-Quellcode

    1. using System.Windows;
    2. namespace CalendarSample2
    3. {
    4. /// <summary>
    5. /// Interaction logic for MainWindow.xaml
    6. /// </summary>
    7. public partial class MainWindow : Window
    8. {
    9. public MainWindow()
    10. {
    11. InitializeComponent();
    12. DataContext = new MainViewModel();
    13. }
    14. }
    15. }


    ViewModel:

    C#-Quellcode

    1. using System;
    2. using System.Collections.ObjectModel;
    3. using System.ComponentModel;
    4. using System.Runtime.CompilerServices;
    5. namespace CalendarSample2
    6. {
    7. public class MainViewModel : INotifyPropertyChanged
    8. {
    9. private DateTime _selectedDate;
    10. public DateTime SelectedDate
    11. {
    12. get { return _selectedDate; }
    13. set { _selectedDate = value; OnPropertyChanged(); }
    14. }
    15. private ObservableCollection<DateTime> _selectedDates = new ObservableCollection<DateTime>();
    16. public ObservableCollection<DateTime> SelectedDates
    17. {
    18. get { return _selectedDates; }
    19. set { _selectedDates = value; OnPropertyChanged(); }
    20. }
    21. #region INotifyPropertyChanged
    22. public event PropertyChangedEventHandler PropertyChanged;
    23. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    24. {
    25. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    26. }
    27. #endregion
    28. }
    29. }


    CalendarEx Klasse:

    C#-Quellcode

    1. using System.Windows;
    2. using System.Windows.Controls;
    3. namespace CalendarSample2
    4. {
    5. public class CalendarEx : Calendar
    6. {
    7. public SelectedDatesCollection SelectedDatesEx
    8. {
    9. get => (SelectedDatesCollection)GetValue(SelectedDatesExProperty);
    10. set => SetValue(SelectedDatesExProperty, value);
    11. }
    12. // Using a DependencyProperty as the backing store for SelectedDatesEx. This enables animation, styling, binding, etc...
    13. public static readonly DependencyProperty SelectedDatesExProperty =
    14. DependencyProperty.Register("SelectedDatesEx", typeof(SelectedDatesCollection), typeof(CalendarEx), new PropertyMetadata(null));
    15. protected override void OnSelectedDatesChanged(SelectionChangedEventArgs e)
    16. {
    17. SelectedDatesEx = this.SelectedDates;
    18. }
    19. }
    20. }


    sieht dann so aus (abgesehen von der bescheuerten Formatierung des Datums. Ist bei mir IMMER Amerikanisch, warum auch immer):
    "Hier könnte Ihre Werbung stehen..."
    im designer isses bei mir auch immer Hohlbrotisch aber mit der entsprechenden Culture im Programm nichmehr


    Application.Xaml.VB:

    VB.NET-Quellcode

    1. Imports System.Globalization
    2. Imports System.Runtime.CompilerServices
    3. Imports System.Runtime.InteropServices
    4. Imports System.Text.RegularExpressions
    5. Imports System.Threading
    6. Imports System.Windows.Markup
    7. Class Application
    8. Public Shared ReadOnly Property StartUpPath As String = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
    9. Public Shared ReadOnly Property DataBasePath As String = $"{System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)}\Data"
    10. Private Sub Application_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
    11. SetCultureProgramWide(New CultureInfo("de-DE"))
    12. End Sub
    13. Private Sub SetCultureProgramWide(newCulture As CultureInfo)
    14. Dim currentCulture As CultureInfo = newCulture
    15. Thread.CurrentThread.CurrentCulture = currentCulture
    16. Thread.CurrentThread.CurrentUICulture = currentCulture
    17. CultureInfo.DefaultThreadCurrentCulture = currentCulture
    18. CultureInfo.DefaultThreadCurrentUICulture = currentCulture
    19. FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)))
    20. End Sub
    21. End Class

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,
    japp, das hatte ich in einem meiner anderen Projekte auch drin und mich nu wieder erinnert:

    C#-Quellcode

    1. public partial class App : Application
    2. {
    3. public App()
    4. {
    5. FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
    6. new FrameworkPropertyMetadata(XmlLanguage.GetLanguage
    7. (CultureInfo.CurrentCulture.IetfLanguageTag)));
    8. }
    9. }


    und schon wird alles schön angezeigt.

    Mir gefällt DP und AP immer besser :)
    hab die CalendarEx nu noch was angepasst.
    Jetzt werden im Kalender die vergangenen Datumse durchgestrichen und die Wochenenden plus Feiertage der künftigen Datumse auch...



    hier noch die beiden Klassen:
    CalendarEx:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Windows;
    3. using System.Windows.Controls;
    4. namespace CalendarSample
    5. {
    6. public class CalendarEx : Calendar
    7. {
    8. #region DependencyProperties
    9. public SelectedDatesCollection SelectedDatesEx
    10. {
    11. get => (SelectedDatesCollection)GetValue(SelectedDatesExProperty);
    12. set => SetValue(SelectedDatesExProperty, value);
    13. }
    14. // Using a DependencyProperty as the backing store for SelectedDatesEx. This enables animation, styling, binding, etc...
    15. public static readonly DependencyProperty SelectedDatesExProperty =
    16. DependencyProperty.Register("SelectedDatesEx", typeof(SelectedDatesCollection), typeof(CalendarEx), new PropertyMetadata(null));
    17. #endregion
    18. #region Attached Properties
    19. public static DateTime GetAddBlackoutDates(DependencyObject obj)
    20. {
    21. return (DateTime)obj.GetValue(AddBlackoutDatesProperty);
    22. }
    23. public static void SetAddBlackoutDates(DependencyObject obj, bool value)
    24. {
    25. obj.SetValue(AddBlackoutDatesProperty, value);
    26. }
    27. // Using a DependencyProperty as the backing store for AddBlackoutDates. This enables animation, styling, binding, etc...
    28. public static readonly DependencyProperty AddBlackoutDatesProperty =
    29. DependencyProperty.RegisterAttached("AddBlackoutDates", typeof(DateTime), typeof(CalendarEx), new PropertyMetadata(AddBlackoutDatesChanged));
    30. private static void AddBlackoutDatesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    31. {
    32. var cal = d as Calendar;
    33. var yearDays = cal.DisplayDate.GetAllYearDates();
    34. foreach (var date in yearDays)
    35. {
    36. if (date.IsWeekend() || date.IsHoliday(DateTimeHelper.FederalStateEnum.Hessen))
    37. cal.BlackoutDates.Add(new CalendarDateRange(date));
    38. }
    39. }
    40. #endregion
    41. #region Overrides
    42. protected override void OnSelectedDatesChanged(SelectionChangedEventArgs e)
    43. {
    44. SelectedDatesEx = this.SelectedDates;
    45. }
    46. protected override void OnInitialized(EventArgs e)
    47. {
    48. base.OnInitialized(e);
    49. this.BlackoutDates.AddDatesInPast();
    50. }
    51. #endregion
    52. }
    53. }


    und die Helper dazu:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Globalization;
    4. namespace CalendarSample
    5. {
    6. public static class DateTimeHelper
    7. {
    8. #region Week Methods
    9. /// <summary>
    10. /// Gibt zum angegebenen Datum den ersten Tag der Woche zurück.
    11. /// </summary>
    12. /// <param name="date">das zu prüfende Datum</param>
    13. /// <returns></returns>
    14. public static DateTime GetFirstDayOfWeek(this DateTime date)
    15. {
    16. return date.GetFirstDayOfWeek(CultureInfo.CurrentCulture);
    17. }
    18. /// <summary>
    19. /// Gibt zum angegebenen Datum den ersten Tag der Woche in der entsprechenen Kultur zurück.
    20. /// </summary>
    21. /// <param name="date">das zu prüfende Datum</param>
    22. /// <param name="cultureInfo">Kultur</param>
    23. /// <returns></returns>
    24. public static DateTime GetFirstDayOfWeek(this DateTime date, CultureInfo cultureInfo)
    25. {
    26. var day = date.Date;
    27. while (day.DayOfWeek != cultureInfo.DateTimeFormat.FirstDayOfWeek)
    28. {
    29. day = day.AddDays(-1);
    30. }
    31. return day;
    32. }
    33. #endregion
    34. #region Month Methods
    35. /// <summary>
    36. /// Gibt den letzten Tag des Monats des angegebenen Datums zurück.
    37. /// </summary>
    38. /// <param name="date">das zu prüfende Datum</param>
    39. /// <returns></returns>
    40. public static DateTime GetLastDayOfMonth(this DateTime date)
    41. {
    42. return new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
    43. }
    44. #endregion
    45. #region Year Methods
    46. /// <summary>
    47. /// Gibt alle Datumse des Jahres als Liste zurück
    48. /// </summary>
    49. /// <param name="date">das Datum</param>
    50. /// <returns></returns>
    51. public static List<DateTime> GetAllYearDates(this DateTime date)
    52. {
    53. var result = new List<DateTime>();
    54. for (int i = 1; i < 13; i++)
    55. {
    56. for (int j = 1; j < DateTime.DaysInMonth(date.Year, i) + 1; j++)
    57. {
    58. result.Add(new DateTime(date.Year, i, j));
    59. }
    60. }
    61. return result;
    62. }
    63. #endregion
    64. #region Bool Methods
    65. /// <summary>
    66. /// Prüft, ob der Tag auf ein Wochenende fällt.
    67. /// </summary>
    68. /// <param name="date">das zu prüfende Datum</param>
    69. /// <returns>True, falls Wochenende, False falls nicht</returns>
    70. public static bool IsWeekend(this DateTime date)
    71. {
    72. return date.DayOfWeek == DayOfWeek.Saturday
    73. || date.DayOfWeek == DayOfWeek.Sunday;
    74. }
    75. /// <summary>
    76. /// Prüft ob das angegebene Datum ein Feiertag ist
    77. /// </summary>
    78. /// <param name="date">das zu prüfende Datum</param>
    79. /// <returns></returns>
    80. public static bool IsHoliday(this DateTime date)
    81. {
    82. return date.IsHoliday(FederalStateEnum.Invariant);
    83. }
    84. /// <summary>
    85. /// Prüft ob das angegebene Datum ein Feiertag ist
    86. /// </summary>
    87. /// <param name="date">das zu prüfende Datum</param>
    88. /// <param name="state">Bundesland, für das der Feiertag geprüft werden soll</param>
    89. /// <returns></returns>
    90. public static bool IsHoliday(this DateTime date, FederalStateEnum state)
    91. {
    92. return date.GetHolidays(state).Contains(date.Date);
    93. }
    94. #endregion
    95. #region WorkDay Methods
    96. /// <summary>
    97. /// gibt die Anzahl der Arbeitstage zurück
    98. /// </summary>
    99. /// <param name="dtStart">das Start Datum</param>
    100. /// <param name="dtEnd"> das End Datum</param>
    101. /// <returns></returns>
    102. public static int GetWorkDays(this DateTime dtStart, DateTime dtEnd)
    103. {
    104. if (dtStart >= dtEnd)
    105. dtStart = dtStart.AddMonths(-1);
    106. int Days = dtEnd.Subtract(dtStart).Days + 1;
    107. for (int i = 0; i <= Days - 1; i++)
    108. {
    109. if (dtStart.AddDays(i).IsHoliday() || dtStart.AddDays(i).IsWeekend())
    110. Days -= 1;
    111. }
    112. return Days;
    113. }
    114. /// <summary>
    115. /// prüft ob das angegebene Datum ein Arbeitstag ist
    116. /// </summary>
    117. /// <param name="date">das zu prüfende Datum</param>
    118. /// <returns></returns>
    119. public static bool IsWorkDay(this DateTime date)
    120. {
    121. return !date.IsHoliday() || !date.IsWeekend();
    122. }
    123. /// <summary>
    124. /// gibt den letzten Arbeitstag , ausgehend vom angegebenen Datum zurück unter Berücksichtigung des Wochenende und ev. Feiertagen
    125. /// </summary>
    126. /// <param name="date">das zu prüfende Datum</param>
    127. /// <returns></returns>
    128. public static DateTime GetLastWorkDay(this DateTime date)
    129. {
    130. switch (date.DayOfWeek)
    131. {
    132. case DayOfWeek.Saturday:
    133. {
    134. date = date.AddDays(-1);
    135. break;
    136. }
    137. case DayOfWeek.Sunday:
    138. {
    139. date = date.AddDays(-2);
    140. break;
    141. }
    142. default:
    143. {
    144. if (date.IsHoliday())
    145. date = GetLastWorkDay(date.AddDays(-1));
    146. break;
    147. }
    148. }
    149. return date;
    150. }
    151. #endregion
    152. #region Holiday Methods
    153. /// <summary>
    154. /// gibt alle Feiertage des Jahres des angegebenen Datums zurück und berücksichtigt das Bundesland.
    155. /// </summary>
    156. /// <param name="date">das Datum</param>
    157. /// <param name="state">Bundesland, für das der Feiertag geprüft werden soll</param>
    158. /// <returns></returns>
    159. public static List<DateTime> GetHolidays(this DateTime date, FederalStateEnum state)
    160. {
    161. var result = new List<DateTime>();
    162. switch (state)
    163. {
    164. case FederalStateEnum.SachsenAnhalt:
    165. result.Add(new DateTime(date.Year, 1, 6)); //Heilige Drei Könige
    166. break;
    167. case FederalStateEnum.BadenWürtenberg:
    168. case FederalStateEnum.Bayern:
    169. result.Add(new DateTime(date.Year, 1, 6)); //Heilige Drei Könige
    170. goto case FederalStateEnum.RheinlandPfalz;
    171. case FederalStateEnum.Saarland:
    172. result.Add(new DateTime(date.Year, 8, 15)); //Mariä Himmelfahrt
    173. goto case FederalStateEnum.RheinlandPfalz;
    174. case FederalStateEnum.NordrheinWestfalen:
    175. case FederalStateEnum.RheinlandPfalz:
    176. result.Add(new DateTime(date.Year, 11, 1)); //Allerheiligen
    177. break;
    178. }
    179. //alle Bundesländer
    180. result.Add(new DateTime(date.Year, 1, 1)); //Neujahr
    181. result.Add(new DateTime(date.Year, 5, 1)); //Tag der Arbeit
    182. result.Add(new DateTime(date.Year, 10, 3)); //Tag der dt. Einheit
    183. result.Add(new DateTime(date.Year, 12, 25)); //1. Weihnachtstag
    184. result.Add(new DateTime(date.Year, 12, 26)); //2. Weihnachtstag
    185. // Ostersonntag holen
    186. DateTime osterSonntag = GetEaster(date.Year);
    187. result.Add(osterSonntag); //Ostersonntag
    188. result.Add(osterSonntag.AddDays(1)); //Ostermontag
    189. result.Add(osterSonntag.AddDays(-2)); //Karfreitag
    190. result.Add(osterSonntag.AddDays(39)); //Christi Himmelfahrt
    191. result.Add(osterSonntag.AddDays(49)); //Pfingstsonntag
    192. result.Add(osterSonntag.AddDays(50)); //Pfingstmontag
    193. if (state == FederalStateEnum.BadenWürtenberg || state == FederalStateEnum.Bayern || state == FederalStateEnum.Hessen
    194. || state == FederalStateEnum.NordrheinWestfalen || state == FederalStateEnum.RheinlandPfalz
    195. || state == FederalStateEnum.Saarland)
    196. {
    197. result.Add(osterSonntag.AddDays(60)); //Fronleichnam
    198. }
    199. return result;
    200. }
    201. /// <summary>
    202. /// gibt den Ostersonntag des angegebenen Jahres
    203. /// </summary>
    204. /// <param name="year">das Jahr</param>
    205. /// <returns></returns>
    206. private static DateTime GetEaster(int year)
    207. {
    208. int a = year % 19;
    209. int b = year / 100;
    210. int c = (8 * b + 13) / 25 - 2;
    211. int d = b - (year / 400) - 2;
    212. int e = (19 * (year % 19) + ((15 - c + d) % 30)) % 30;
    213. if (e == 28)
    214. {
    215. if (a > 10)
    216. e = 27;
    217. }
    218. else if (e == 29)
    219. e = 28;
    220. int f = (d + 6 * e + 2 * (year % 4) + 4 * (year % 7) + 6) % 7;
    221. return new DateTime(year, 3, 22).AddDays(e + f);
    222. }
    223. #endregion
    224. #region Federal States Enum
    225. /// <summary>
    226. /// Auflistung der Bundesländer in Deutschland
    227. /// </summary>
    228. public enum FederalStateEnum
    229. {
    230. Invariant,
    231. BadenWürtenberg,
    232. Bayern,
    233. Berlin,
    234. Brandenburg,
    235. Bremen,
    236. Hamburg,
    237. Hessen,
    238. MecklenburgVorpommern,
    239. Niedersachsen,
    240. NordrheinWestfalen,
    241. RheinlandPfalz,
    242. Saarland,
    243. Sachsen,
    244. SachsenAnhalt,
    245. SchleswigHolstein,
    246. Thüringen
    247. }
    248. #endregion
    249. }
    250. }
    "Hier könnte Ihre Werbung stehen..."