سلام دوستان
قسمت دوم آموزش رو میخوام شروع کنم
خب گفتم که آموزش دو قسمت داره
1- روش ساخت فرم تقویم
2- روش ساخت کامپوننت
شروع میکنیم به ساخت فرم تقویم
یه پروژه جدید از نوع WindowsApplication ایجاد کنید (اسم پروژه تون رو هم هرچی دلتون میخواد بدید من دادم BPersianCalender)
Form1 رو به هر نامی اسمشو تغییر بدید که من اسم فرمم رو گذاشتم PCalender
خاصیت های زیر رو برای فرم تنظیم کنید
RightToLeft=True
Font=Tahoma 8pt
Text=تقویم شمسی | تاریخ انتخاب شده :
Siize:341; 253
FormBorderStyle:FixedToolWindow
فرمتون الان باید به شکل زیر باشه
pCalender.png
دوتا Button اضافه کنید خاصیت Text رو به ترتیب "امروز" و "بستن" بزارید با یه نامی که براش ست میکنید
چهار تا Button هم اضافه کنید رو فرم برای ماه بعد و قبل و همچنین برا سال بعد و قبل خاصیت Name رو هم براش به ترتیب زیر ست کنید
NextMont-PrevMonth
NextYear-PrevYear
خاصیت Cursor=Hand برای Button های کنترل ماه و سال
تو این مرحله فرم شما باید به شکل زیر باشه
1.png
چهار تا Button رو میبینید که من براشون یه تصویری هم استفاده کردم (اینا دیگه سلیقه ای هستش)
دوتا لیبیل "ماه" و "سال" رو هم که میبیند جهت نمایش ماه و سال جاری هستش به ترتیب خاصیت Name رو برابر با lblMounth و lblYaer تعیین کنید
یه Panel اضافه کنید به فرم و توش 7 تا Lable اضافه کنید برای درج اسم روزهای هفته شنبه تا جمعه
2.png
روزهای هفته رو میتونید ببینید
مرحله بعدی بدنه اصلی تقویم هستش که روزها قراره تو اون نشون داده بشه
از لیست ابزارهاتون یدونه DataGridView بندازید رو فرم اسمشو بزارید dgCalander و بدون اینکه کاری بکنید وارد فایل Designer فرمتون بشید و کد زیر رو کپی کنید تو قمست Designer
اگه متد زیر رو باز کنید
private void InitializeComponent()
میرسید به خط زیر
// // dgCalander
//
کد های مربوط به دیتا گرید رو با کد زیر جایگزین کنید
this.dgCalander.AllowUserToDeleteRows = false;
this.dgCalander.AllowUserToResizeColumns = false;
this.dgCalander.AllowUserToResizeRows = false;
this.dgCalander.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMo de.Fill;
this.dgCalander.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.dgCalander.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.S unken;
this.dgCalander.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle .Sunken;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment. MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.Color.OliveDrab;
dataGridViewCellStyle1.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
dataGridViewCellStyle1.ForeColor = System.Drawing.Color.Maroon;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dgCalander.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.dgCalander.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeig htSizeMode.DisableResizing;
this.dgCalander.ColumnHeadersVisible = false;
this.dgCalander.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.c0,
this.c1,
this.c2,
this.c3,
this.c4,
this.c5,
this.c6});
this.dgCalander.Cursor = System.Windows.Forms.Cursors.Default;
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment. MiddleCenter;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dgCalander.DefaultCellStyle = dataGridViewCellStyle2;
this.dgCalander.Location = new System.Drawing.Point(0, 66);
this.dgCalander.Margin = new System.Windows.Forms.Padding(5, 4, 5, 4);
this.dgCalander.MultiSelect = false;
this.dgCalander.Name = "dgCalander";
this.dgCalander.ReadOnly = true;
this.dgCalander.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle .Sunken;
this.dgCalander.RowHeadersVisible = false;
this.dgCalander.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSi zeMode.DisableResizing;
this.dgCalander.RowTemplate.DefaultCellStyle.Align ment = System.Windows.Forms.DataGridViewContentAlignment. MiddleCenter;
this.dgCalander.RowTemplate.Height = 18;
this.dgCalander.RowTemplate.ReadOnly = true;
this.dgCalander.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.False;
this.dgCalander.Size = new System.Drawing.Size(323, 97);
this.dgCalander.TabIndex = 0;
this.dgCalander.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler( this.dgCalander_CellClick);
this.dgCalander.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler( this.dgCalander_CellDoubleClick);
this.dgCalander.CellEnter += new System.Windows.Forms.DataGridViewCellEventHandler( this.dgCalander_CellEnter);
this.dgCalander.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dgCaland er_KeyDown);
//
// c0
//
this.c0.HeaderText = "ش";
this.c0.Name = "c0";
this.c0.ReadOnly = true;
//
// c1
//
this.c1.HeaderText = "1ش";
this.c1.Name = "c1";
this.c1.ReadOnly = true;
//
// c2
//
this.c2.HeaderText = "2ش";
this.c2.Name = "c2";
this.c2.ReadOnly = true;
//
// c3
//
this.c3.HeaderText = "3ش";
this.c3.Name = "c3";
this.c3.ReadOnly = true;
//
// c4
//
this.c4.HeaderText = "4ش";
this.c4.Name = "c4";
this.c4.ReadOnly = true;
//
// c5
//
this.c5.HeaderText = "5ش";
this.c5.Name = "c5";
this.c5.ReadOnly = true;
//
// c6
//
this.c6.HeaderText = "ج";
this.c6.Name = "c6";
this.c6.ReadOnly = true;
اگه به فرم برگردید دیتا گرید رو میبینید که با خصوصیاتی که شما براش در نظر گرفتید طراحی شده!
دیتا گرید رو طوری رو صفحه درگ کنید که هر کدام از ستونها دقیقا زیر روز مربوطه قرار بگیرند
اگه کار رو درست انجام داده باشید فرم شما باید به شکل زیر باشه
3.png
دوتا لیبل زیر دیتا گرید اضافه کنید
و تکت هر کدوم رو به ترتیب برابر با تاریخ شمسی و تاریخ میلادی تعیین کنید
جلوی این دوتا لیبیل دو تا لیبل دیگه بندازید که تاریخ شمسی و میلادی انتخاب شده رو نشون میده
اسماشونو بزارید lblShamsi و lblMiladi
خب طراحی فرم ما تموم شده حالا باید بریم سراغ کد نویسی
رو فرم دابل کلیک کنید و کدهای زیر رو قبل از تابع سازنده فرم اضافه کنید
کدهای مربوطi
PersianCalendar pc = new PersianCalendar();//دسترسی به کتابخونه تاریخ شمسی
private DateTime NowDate = DateTime.Now;// نگهدارنده تاریخ میلادی جاری
static int mounthName;//نام ماه
static int YearName;//نام سال
int selectedYear, selectdMonth, selectedDay;//روز-ماه-سال انتخاب شده
int rowIndex, columnIndex;//ایندکس ستون و ایندکس سطر
string selectedShamsiDate;//تاریخ شمسی انتخاب شده
DateTime selectedMiladiDate;//تاریخ میلادی انتخاب شده
shamsiCalander objshamsiCalander = new shamsiCalander();//کلاس نگهدارنده تاریخ
کلاس shamsiCalander رو به صورت زیر داخل فرم اضافه کنید
public class shamsiCalander
{
public string ShamsiDate { get; set; }
public DateTime MiladiDate { get; set; }
}
بعد از InitializeComponent دو خط کد زیر رو اضافه کنید که جهت نگهداری ماه و سال هستش
mounthName = pc.GetMonth(NowDate);
YearName = pc.GetYear(NowDate);
داخل رویداد Load فرم قطعه کد زیر رو اضافه کنید
this.Text += " " + MiladiToShamsi(DateTime.Now);
FillCalander();
FindCurrentDate();
getDates();
این کد جهت درج سطر به دیتا گریدتون هستش که قراره روزهای تقویم رو نگهداری کنند
تابع MiladiToShamsi رو به فرمتون اضافه کنید
public string MiladiToShamsi(DateTime Mdate)
{
string Result = pc.GetYear(Mdate).ToString();
string Month = Convert.ToString(pc.GetMonth(Mdate));
string day = Convert.ToString(pc.GetDayOfMonth(Mdate));
if (Month.Length == 1)
Month = "0" + Month;
if (day.Length == 1)
day = "0" + day;
Result += "/" + Month + "/" + day;
return Result;
}
کار این تابع اینه که شما یه تاریخ میلادی رو بهش پاس میکنید و معادل شمسی اون رو بصورت رشته براتون برمی گردونه
کد زیر رو به قسمت Load فرمتون اضافه کنید
this.Text += " " + MiladiToShamsi(DateTime.Now);
یه متد به نام FindCurrentDate اضافه کنید به صورت زیر
private void FindCurrentDate()
{
int tYear, tMonth, tDay = 0;
tYear = pc.GetYear(DateTime.Now);
tMonth = pc.GetMonth(DateTime.Now);
tDay = pc.GetDayOfMonth(DateTime.Now);
mounthName = tMonth;
YearName = tYear;
lblYear.Text = tYear.ToString();
lblMounth.Text = getMounth(tMonth);
ResetCalender();
FillCalander();
for (int i = 0; i <= 4; i++)
{
for (int x = 0; x < 7; x++)
{
if (dgCalander.Rows[i].Cells["c" + x.ToString()].Value.ToString() == tDay.ToString())
{
dgCalander.ClearSelection();
dgCalander.Rows[i].Cells["c" + x.ToString()].Selected = true;
}
}
}
}
تابع getMounth رو هم به فرم اضافه کنید
private string getMounth(int Mounth)
{
string MounthName = string.Empty;
switch (Mounth)
{
case 1: MounthName = "فروردین";
break;
case 2: MounthName = "اردیبهشت";
break;
case 3: MounthName = "خرداد";
break;
case 4: MounthName = "تیر";
break;
case 5: MounthName = "مرداد";
break;
case 6: MounthName = "شهریور";
break;
case 7: MounthName = "مهر";
break;
case 8: MounthName = "آبان";
break;
case 9: MounthName = "آذر";
break;
case 10: MounthName = "دی";
break;
case 11: MounthName = "بهمن";
break;
case 12: MounthName = "اسفند";
break;
}
return MounthName;
}
خب یکمی از راه رو پیش اومدیم حالا یبار فرمتون رو Run کنید تا ببینید خروجی به چه شکل میشه
به متد FindCurrentDate یکسری کد دیگه بعد قراره اضافه بشه
خب دوستان اگه اشکالی نداشته باشه من باید ادامه آموزش رو بندازم برای روزهای بعد
انشالله اگه این آموزش برا دوستان مفید بوده باشه و دوستان استقبال کنند ادامه آموزش رو تو روزهای بعدی در خدمتتون خواهم بود.
فعلا بای.........