Click here to Skip to main content
Click here to Skip to main content

Persian Diary in WPF

, 6 Jan 2010
Rate this:
Please Sign up or sign in to vote.
With Persian Diary, you can navigate in Persian Calendar and store your memorandums
Persian Calendar in WPF

Introduction

With this software, you can navigate the Persian Calendar and you can add your memorandum for each day.

Using the Code

I've created this project with .NET Framework 3.5 SP1, so you need to install it to use this project.
I've also used a SQL database(mdf) to store the data, so at least you have to install SQL Express 2008.

Creating the UI

The best way for creating a software UI like this is to use a Stack.

Then we should use UniformGrids and Grids in the Stack to create the UI.
For instance, the XAML code for 1 in the above figure is:

<StackPanel x:Name="stackPanel">
    <StackPanel.BitmapEffect>
        <BlurBitmapEffect Radius="0"/>
    </StackPanel.BitmapEffect>
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center" 
        x:Name="header" MinHeight="70">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.135*"/>
            <ColumnDefinition Width="0.102*"/>
            <ColumnDefinition Width="0.494*"/>
            <ColumnDefinition Width="0.14*"/>
            <ColumnDefinition Width="0.129*"/>
        </Grid.ColumnDefinitions>
        <TextBlock FlowDirection="RightToLeft" Language="fa-ir" 
            FontSize="36" x:Name="TextBlockThisMonth" HorizontalAlignment="Center" 
            Grid.Column="2" VerticalAlignment="Center" Margin="0,0,0,0" 
            FontFamily="Arial">تاریخ</TextBlock>

        <Button x:Name="previousMonth" Content=" ماه قبل &gt; " 
            Grid.Column="3" VerticalAlignment="Center" Click="previousMonth_Click" 
            HorizontalAlignment="Center" />
        <Button x:Name="nextMonth" Content=" &lt; ماه بعد " Grid.Column="1" 
            HorizontalAlignment="Center" VerticalAlignment="Center" 
            Click="nextMonth_Click" />

        <Button x:Name="previousYear" Content=" سال قبل &gt;&gt; " 
            Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center" 
            Click="previousYear_Click" />
        <Button x:Name="nextYear" Content=" &lt;&lt; سال بعد " 
            HorizontalAlignment="Center"  Click="nextYear_Click" 
            VerticalAlignment="Center"  />

    </Grid>
    <UniformGrid Columns="7" Rows="1" x:Name="dayNames" MinHeight="30">
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyleForHolydays}"/>
            <TextBlock HorizontalAlignment="Center" 
            VerticalAlignment="Center"><Run FlowDirection="RightToLeft" 
            Language="fa-ir" Text="جمعه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="پنج شنبه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="چهار شنبه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="سه شنبه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="دو شنبه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="یک شنبه"/></TextBlock>
        </Grid>
        <Grid>
            <Rectangle Style="{DynamicResource RectangleStyle1}" />
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
            FontSize="14"><Run FlowDirection="RightToLeft" Language="fa-ir" 
            Text="شنبه"/></TextBlock>
        </Grid>
    </UniformGrid>
    <!-- *********************************************************** -->
    (The XAML of 2)
     .
    .
    .
</StackPanel>

The XAML code for 2 in the above figure is:

<UniformGrid Columns="7" Rows="1" Margin="0,10,0,0" 
	x:Name="calendarRow01" MinHeight="80">
    <Grid x:Name="GridJome0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="RectangleJome0" 
			Style="{DynamicResource RectangleStyleForHolydays}" />
        <TextBlock x:Name="TextBlockJome0Miladi" 
        	Style="{DynamicResource TextBlockStyle6}">08 Dec</TextBlock>
        <TextBlock x:Name="TextBlockJome0Hijri" 
        	Style="{DynamicResource TextBlockStyle10}">۰۱ محرم</TextBlock>
        <TextBlock x:Name="TextBlockJome0" 
        	Style="{DynamicResource TextBlockStyle1}">جمعه</TextBlock>
    </Grid>
    <Grid x:Name="Grid5Shanbe0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="Rectangle5Shanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlock5Shanbe0Miladi" Text="08 Dec" 
        	Style="{DynamicResource TextBlockStyle6}"/>
        <TextBlock x:Name="TextBlock5Shanbe0Hijri" Text="۰۱ محرم" 
        	Style="{DynamicResource TextBlockStyle10}"/>
        <TextBlock x:Name="TextBlock5Shanbe0" 
        	Style="{DynamicResource TextBlockStyle1}">پنج شنبه</TextBlock>
    </Grid>
    <Grid x:Name="Grid4Shanbe0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="Rectangle4Shanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlock4Shanbe0Miladi" Text="08 Dec" 
        	Style="{DynamicResource TextBlockStyle6}"/>
        <TextBlock x:Name="TextBlock4Shanbe0Hijri" Text="۰۱ محرم" 
        	Style="{DynamicResource TextBlockStyle10}"/>
        <TextBlock x:Name="TextBlock4Shanbe0" 
        	Style="{DynamicResource TextBlockStyle1}">چهار شنبه</TextBlock>
    </Grid>
    <Grid x:Name="Grid3Shanbe0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="Rectangle3Shanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlock3Shanbe0Miladi" Text="08 Dec" 
        	Style="{DynamicResource TextBlockStyle6}"/>
        <TextBlock x:Name="TextBlock3Shanbe0Hijri" Text="۰۱ محرم" 
        	Style="{DynamicResource TextBlockStyle10}"/>
        <TextBlock x:Name="TextBlock3Shanbe0" 
        	Style="{DynamicResource TextBlockStyle1}">سه شنبه</TextBlock>
    </Grid>
    <Grid x:Name="Grid2Shanbe0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="Rectangle2Shanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlock2Shanbe0Miladi" Text="08 Dec" 
        	Style="{DynamicResource TextBlockStyle6}"/>
        <TextBlock x:Name="TextBlock2Shanbe0Hijri" Text="۰۱ محرم" 
        	Style="{DynamicResource TextBlockStyle10}"/>
        <TextBlock x:Name="TextBlock2Shanbe0" 
        	Style="{DynamicResource TextBlockStyle1}">دو شنبه</TextBlock>
    </Grid>
    <Grid x:Name="Grid1Shanbe0" Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="Rectangle1Shanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlock1Shanbe0Miladi" 
        	Style="{DynamicResource TextBlockStyle6}" Text="08 Dec" Margin="0,0,10,5"/>
        <TextBlock x:Name="TextBlock1Shanbe0Hijri" 
        	Style="{DynamicResource TextBlockStyle10}" Text="۰۱ محرم" />
        <TextBlock x:Name="TextBlock1Shanbe0" 
        	Style="{DynamicResource TextBlockStyle1}">یک شنبه</TextBlock>
    </Grid>
    <Grid x:Name="GridShanbe0"  Style="{DynamicResource GridStyle}">
        <Rectangle x:Name="RectangleShanbe0" 
        	Style="{DynamicResource RectangleStyle2}" />
        <TextBlock x:Name="TextBlockShanbe0" 
        	Style="{DynamicResource TextBlockStyle1}" >شنبه</TextBlock>
        <TextBlock x:Name="TextBlockShanbe0Miladi" Text="08 Dec"  
        	Style="{DynamicResource TextBlockStyle6}"/>
        <TextBlock x:Name="TextBlockShanbe0Hijri" Text="۰۱ محرم" 
        	Style="{DynamicResource TextBlockStyle10}"/>
    </Grid>
</UniformGrid>

The XAML code for 3 in the above figure is:
<Grid x:Name="Grid5Shanbe0" Style="{DynamicResource GridStyle}">
    <Rectangle x:Name="Rectangle5Shanbe0" 
    	Style="{DynamicResource RectangleStyle2}" />
    <TextBlock x:Name="TextBlock5Shanbe0Miladi" Text="08 Dec" 
    	Style="{DynamicResource TextBlockStyle6}"/>
    <TextBlock x:Name="TextBlock5Shanbe0Hijri" Text="۰۱ محرم" 
    	Style="{DynamicResource TextBlockStyle10}"/>
    <TextBlock x:Name="TextBlock5Shanbe0" 
    	Style="{DynamicResource TextBlockStyle1}">پنج شنبه</TextBlock>
</Grid>

The XAML code for 4 in the above figure is:

<Grid x:Name="footer" MinHeight="70">

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.121*"/>
        <ColumnDefinition Width="0.132*"/>
        <ColumnDefinition Width="0.07*"/>
        <ColumnDefinition Width="0.119*"/>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.084*"/>
        <ColumnDefinition Width="0.064*"/>
        <ColumnDefinition Width="0.11*"/>
    </Grid.ColumnDefinitions>

    <Button x:Name="goToToday" Content="  پرش به امروز  " 
    	Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center" 
        Click="goToToday_Click"  />

    <WindowsFormsHost Grid.Column="0" FontSize="13" VerticalAlignment="Center" 
    	HorizontalAlignment="Center" Width="70" Height = "25">
        <wf:MaskedTextBox Text="سال"  x:Name="textBoxYear" Mask="0000"/>
    </WindowsFormsHost>

    <ComboBox Grid.Column="1" FontSize="13" HorizontalAlignment="Center" 
    	VerticalAlignment="Center" IsSynchronizedWithCurrentItem="True" 
        	Width="85" x:Name="comboBoxMonths">
        <ComboBoxItem Content="فروردین" IsSelected="True"/>
        <ComboBoxItem Content="اردیبهشت"/>
        <ComboBoxItem Content="خرداد"/>

        <ComboBoxItem Content="تیر"/>
        <ComboBoxItem Content="مرداد"/>
        <ComboBoxItem Content="شهریور"/>

        <ComboBoxItem Content="مهر"/>
        <ComboBoxItem Content="آبان"/>
        <ComboBoxItem Content="آذر"/>

        <ComboBoxItem Content="دی"/>
        <ComboBoxItem Content="بهمن"/>
        <ComboBoxItem Content="اسفند"/>
    </ComboBox>

    <Button x:Name="goToDate" Content="  برو  " Grid.Column="2" 
    	VerticalAlignment="Center" HorizontalAlignment="Center" 
        Click="goToDate_Click" />
    <TextBlock Text="تنظیم ماه قمری" Grid.Column="7" HorizontalAlignment="Center" 
    	VerticalAlignment="Center"/>
    <TextBox x:Name="TextBoxHijriAdjustment" Text="" Grid.Column="6" 
    	HorizontalAlignment="Stretch" VerticalAlignment="Center" Width="30" />
    <Button x:Name="ButttonHijriAdjustment" Content="  تنظیم  " 
    	Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center" 
        Click="ButttonHijriAdjustment_Click"  />
        
</Grid>

I also created a couple of Storyboards to show and hide the below panel.
This panel updates the database with your input data.

The XAML of Storyboards is given below:

<Storyboard x:Key="showEventGrid">
    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="EventGrid" 
    	Storyboard.TargetProperty="(UIElement.Visibility)">
        <DiscreteObjectKeyFrame KeyTime="00:00:00" 
        Value="{x:Static Visibility.Visible}"/>
        <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" 
        Value="{x:Static Visibility.Visible}"/>
    </ObjectAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="EventGrid" 
        Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="1"/>
    </DoubleAnimationUsingKeyFrames>
    <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="EventGrid" Storyboard.TargetProperty
        	="(FrameworkElement.Margin)">
        <SplineThicknessKeyFrame KeyTime="00:00:00" Value="0,0,0,0"/>
        <SplineThicknessKeyFrame KeyTime="00:00:00.5000000" Value="0,0,0,0"/>
    </ThicknessAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="stackPanel" 
        Storyboard.TargetProperty="(UIElement.BitmapEffect)
        	.(BlurBitmapEffect.Radius)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="6"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="hideEventGrid">
    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="EventGrid" 
        Storyboard.TargetProperty="(UIElement.Visibility)">
        <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" 
        Value="{x:Static Visibility.Hidden}"/>
    </ObjectAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="EventGrid" 
		Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="stackPanel" 
        Storyboard.TargetProperty="(UIElement.BitmapEffect).(BlurBitmapEffect.Radius)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
    <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" 
    	Storyboard.TargetName="EventGrid" 
        Storyboard.TargetProperty="(FrameworkElement.Margin)">
        <SplineThicknessKeyFrame KeyTime="00:00:00.5000000" Value="0,0,0,0"/>
    </ThicknessAnimationUsingKeyFrames>
</Storyboard>

The C# Code

In Persian Calendar, we have 12 months that I have shown in the following code snippet:

//Season { MonthName(nomber of days in the month) ...}
Spring { Farvardin(31), OrdiBehesht(31), Khordad(31) }
Summer { Tir(31), Mordad(31), Shahrivar(31) }
Autumn { Mehr(30), Aban(30), Azar(30) }
Winter { Day(30), Bahman(30), Esfand(30 or 29) }

Fortunately there is a class in .NET for creating Persian Calendar and I've used it.

PersianCalendar persianCalendar = new PersianCalendar();

The main method in this project to create a Persian month is calculateMonth.

/// <summary>
/// The main method to show the calendar
/// This method shows `thisMonth` in `thisYear`
/// </summary>
void calculateMonth(int thisYear, int thisMonth)
{
    try
    {
        yearForNavigating = thisYear;
        monthForNavigating = thisMonth;

        DateTime tempDateTime = persianCalendar.ToDateTime(yearForNavigating, 
        	monthForNavigating, 15, 01, 01, 01, 01);

        int thisDay = 1;
        TextBlockThisMonth.Text = "";
        TextBlockThisMonth.Text =
            monthForNavigating.convertToPersianMonth() + " " +
            yearForNavigating.convertToPersianNumber();

        //Different between first place of calendar and first place of this month
        //اختلاف بین خانه شروع ماه و اولین خانه تقویم            
        string DayOfWeek = persianCalendar.GetDayOfWeek(persianCalendar.
        	ToDateTime(thisYear, thisMonth, 01, 01, 01, 01, 01)).ToString();
        int span = calculatePersianSpan(DayOfWeek.convertToPersianDay());

        decreasePersianDay(ref thisYear, ref thisMonth, ref thisDay, span);

        string persianDate;//حاوی تاریخ روزهای شمسی Contains the date of Persian
        string miladiDate;//حاوی تاریخ روزهای میلادی Contains the date of Christian
        string hijriDate;//حاوی تاریخ روزهای قمری Contains the date of Hijri

        string tooltip_context = "";//Contains the text of tooltip

        ////////////////////////////////////

        for (int i = 0; i < 6 * 7; i++)
        {
            tempDateTime = persianCalendar.ToDateTime(thisYear, thisMonth, 
            	thisDay, 01, 01, 01, 01);

            miladiDate = tempDateTime.Day.ToString() + " " + 
            	englishMonthName(tempDateTime.Month) 
            	+ " " + tempDateTime.Year.ToString();
            hijriDate = hijriCalendar.GetDayOfMonth
		(tempDateTime).convertToPersianNumber() 
                + " " + hijriCalendar.GetMonth
			(tempDateTime).convertToHigriMonth() + " " 
                + hijriCalendar.GetYear(tempDateTime).convertToPersianNumber();
            persianDate = thisDay.convertToPersianNumber();

            DayOfWeek = persianCalendar.GetDayOfWeek(tempDateTime).ToString();

            if (thisMonth == monthForNavigating)
            {
                tooltip_context = "";
                if (thisDay == currentDay && thisMonth == currentMonth && 
                	thisYear == currentYear)//بررسی تاریخ امروز
                {
                    tooltip_context = GetTextOfMemo
			(thisYear, thisMonth, thisDay, "Shamsi");
                    if (tooltip_context == "")
                        tooltip_context = GetTextOfMemo(tempDateTime.Year, 
                        	tempDateTime.Month, 
                        	tempDateTime.Day, "Miladi");
                    if (tooltip_context == "")
                        tooltip_context = GetTextOfMemo
				(hijriCalendar.GetYear(tempDateTime), 
                        	hijriCalendar.GetMonth(tempDateTime), 
                            	hijriCalendar.GetDayOfMonth(tempDateTime), "Hijri");

                    if (DayOfWeek.convertToPersianDay() == "جمعه")//بررسی جمعه بودن روز
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyleForHolydays_CurrentDay", "TextBlockStyle3", 
                            "TextBlockStyle12", "TextBlockStyle8", tooltip_context);
                    else
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyleToday", 
			"TextBlockStyle5", "TextBlockStyle10", 
                            "TextBlockStyle6", tooltip_context);
                }
                else if (searchShamsiTable(thisYear, thisMonth, thisDay))
                {
                    tooltip_context = GetTextOfMemo
			(thisYear, thisMonth, thisDay, "Shamsi");
                    if (isHoliday(thisYear, thisMonth, thisDay, "Shamsi"))
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle5", "TextBlockStyle3", "TextBlockStyle12", 
                            "TextBlockStyle8", tooltip_context);
                    else
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle4", "TextBlockStyle1", "TextBlockStyle10", 
                        	"TextBlockStyle6", tooltip_context);
                }
                else if (searchHijriTable(hijriCalendar.GetYear(tempDateTime), 
                	hijriCalendar.GetMonth(tempDateTime), 
                    hijriCalendar.GetDayOfMonth(tempDateTime)))
                {
                    tooltip_context = GetTextOfMemo
					(hijriCalendar.GetYear(tempDateTime), 
                    	hijriCalendar.GetMonth(tempDateTime), hijriCalendar.
                        GetDayOfMonth(tempDateTime), "Hijri");
                    if (isHoliday(thisYear, thisMonth, thisDay, "Hijri"))
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle5", "TextBlockStyle3", "TextBlockStyle12", 
                            "TextBlockStyle8", tooltip_context);
                    else
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle4", "TextBlockStyle5", "TextBlockStyle10", 
                            "TextBlockStyle6", tooltip_context);
                }
                else if (searchMiladiTable(tempDateTime.Year, tempDateTime.Month, 
                	tempDateTime.Day))
                {
                    tooltip_context = GetTextOfMemo
			(tempDateTime.Year, tempDateTime.Month, 
                    	tempDateTime.Day, "Miladi");
                    if (isHoliday(thisYear, thisMonth, thisDay, "Miladi"))
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle5", "TextBlockStyle3", "TextBlockStyle12", 
                            "TextBlockStyle8", tooltip_context);
                    else
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle4", "TextBlockStyle5", "TextBlockStyle10", 
                        	"TextBlockStyle6", tooltip_context);
                }
                else
                {
                    if (DayOfWeek.convertToPersianDay() == 
					"جمعه")//بررسی جمعه بودن روز
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyleForHolydays", "TextBlockStyle3", 
                            "TextBlockStyle12", 
                            "TextBlockStyle8", tooltip_context);
                    else
                        changeProperties(i, persianDate, hijriDate, miladiDate, 
                        	"RectangleStyle2", "TextBlockStyle5", "TextBlockStyle10", 
                            "TextBlockStyle6", tooltip_context);
                }
            }
            else
            {
                if (DayOfWeek.convertToPersianDay() == "جمعه")//بررسی جمعه بودن روز
                    changeProperties(i, persianDate, hijriDate, miladiDate, 
                    	"RectangleStyleForOtherHolydays", "TextBlockStyle4", 
                        "TextBlockStyle13", "TextBlockStyle9", tooltip_context);
                else
                    changeProperties(i, persianDate, hijriDate, miladiDate, 
                    	"RectangleStyle3", 
                    	"TextBlockStyle2", "TextBlockStyle11", "TextBlockStyle7", 
                        tooltip_context);
            }

            increasePersianDay(ref thisYear, ref thisMonth, ref thisDay, 1);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Exception", MessageBoxButton.OK, 
        	MessageBoxImage.Error);
    }
}

Then I've used LINQ to update the database.
First I've added a LINQ to SQL class:

Then I designed DataClasses1.dbml:

Then we can update the database easily with a LINQ query.
For instance, I wrote this method to search shamsi table.

/// <summary>
/// Searches the Database shamsi table
/// </summary>
/// <returns>If the input data is found in the table return true, else 
/// return false</returns>
bool searchShamsiTable(int year, int month, int day)
{
    bool result = false;
    try
    {
        int? id = null;
        id = (from q in db.shamsis
              where (q.year == year && q.day == day && q.month == month) 
              	|| (q.anniversary == true && q.month == month && q.day == day)
              select q.id).First();
        if (id != null) result = true;
    }
    catch { result = false; }
    return result;
} 

Further reading about LINQ to SQL can be done here.
Other methods are simple and easy to learn and I've explained them with some comments.

Point of Interest

The point of interest in this project (for me) was, using a WinForm control in WPF.
I've used a WinForm Masked TextBox for input year.

For using a WinForm Masked TextBox in a WPF App: I added these DLLs to my references:

  • WindowsFormsIntegration.dll
  • System.Windows.Forms.dll 

Then I added the following line within Window tag in the XAML source:

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

At last, I added the MaskedTextBox control to my WPF App with WindowsFormsHost tag.
<WindowsFormsHost Grid.Column="0" FontSize="13" 
	VerticalAlignment="Center" HorizontalAlignment="Center" 
    Width="70" Height = "25">
	<wf:MaskedTextBox x:Name="textBoxYear" Mask="0000"/>
</WindowsFormsHost>

Further reading about WindowsFormHost can be done here.

History

  • 12th February, 2009: First post
  • 6 th January , 2010 : Database was changed to a XML file and some Bugs were resolved.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Mohammad Dayyan

Iran (Islamic Republic Of) Iran (Islamic Republic Of)
No Biography provided

Comments and Discussions

 
Questionhijri calendar Pinmembersnow_cap5-Feb-13 11:04 
QuestionRegarding Gregorian calendar Pinmembergyanprakashis22-Oct-11 21:40 
GeneralMy vote of 5 PinmemberDariush Tasdighi19-Mar-11 22:24 
QuestionCan You Add Database Version of the Program? PinmemberparvinSh29-Nov-10 2:50 
AnswerRe: Can You Add Database Version of the Program? PinmemberMohammad Dayyan29-Nov-10 5:37 
GeneralRe: Can You Add Database Version of the Program? PinmemberparvinSh29-Nov-10 20:27 
GeneralRe: Can You Add Database Version of the Program? PinmemberMohammad Dayyan30-Nov-10 1:43 
GeneralRe: Can You Add Database Version of the Program? PinmemberparvinSh30-Nov-10 20:28 
GeneralGreat work ! Pinmembersaddozai14-Jun-10 16:36 
Hi Mohammad,
 
Salam,
 
Can you please guide me through to develop this Diary in English with English Calendar.
 
Thanks
Sanaulah
GeneralExcellent work! PinmemberMehran Taheri27-Mar-10 2:30 
Generaluse something like "persian diary" in web application Pinmembermohammad amin sharifi17-Nov-09 1:21 
GeneralRe: use something like "persian diary" in web application PinmemberMohammad Dayyan17-Nov-09 2:40 
GeneralHi Pinmembersoheilajoon10-Aug-09 7:49 
GeneralRe: Hi PinmemberMohammad Dayyan10-Aug-09 7:51 
GeneralNOT a standard routin & optimized code PinmemberMember 53148905-May-09 11:58 
GeneralRe: NOT a standard routin & optimized code PinmemberMohammad Dayyan16-May-09 16:37 
GeneralThank you Pingroupzhujinlong1984091314-Apr-09 17:48 
GeneralPersian to English Pinmemberfatih_senel23-Feb-09 11:00 
GeneralRe: Persian to English PinmemberMohammad Dayyan23-Feb-09 22:38 
GeneralRe: Persian to English [modified] Pinmemberanen3-Feb-10 19:13 
GeneralRe: Persian to English Pinmemberanen5-Feb-10 10:16 
GeneralRe: Persian to English Pinmember_Mohammad_5-Feb-10 10:22 
GeneralRe: Persian to English Pinmemberanen5-Feb-10 10:47 
GeneralRe: Persian to English Pinmember_Mohammad_5-Feb-10 16:39 
GeneralRe: Persian to English Pinmemberanen6-Feb-10 23:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.140709.1 | Last Updated 6 Jan 2010
Article Copyright 2009 by Mohammad Dayyan
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid