سلام
آیا امکان داره سورس شما رو داشته باشیم ؟
سلام
آیا امکان داره سورس شما رو داشته باشیم ؟
سلام دوست عزیز
بسیار ممنون از آموزش این کامپوننت مهم و کاربردی
اگه میشه آموزشها رو همراه با سورس بذارید
سلام
یه سوال دیگه
روزهای شنبه 1 شنبه، 2شنبه و ... را که تایپ می کنم میخواهم مثل شما اعدادش فارسی باشه، چیکار کنم؟
سلام ، در این کامپوننت روز مشخص شده رو رنگشو به سبز تغییر دادم ، حالا اگر بخوام یه سلول خاص رو سلکت کنم ، چه کدی باید بنویسم ؟
Untitled1.jpg
سلام دوستان بازم معذرت میخوام از بابت تاخیر بوجود آمده جهت آموزش
چون وقتم کمه این جلسه اون قلب کار رو میخوام خدمت دوستان بگم تا بقیش بمونه باز برا بعد
دوتا متد مهم داریم که به شکل زیر
ResetCalender
FillCalender
متد اول کارش اینه که میاد کل لیست رو خالی میکنه(پاک میکنه) و بعد از خالی شدن متد دوم میاد لیست رو بر اساس ماه و سالی که انخاب میکنید پر میکنه
private void ResetCalender()
{
for (int i = 0; i <= 4; i++)
{
for (int x = 0; x < 7; x++)
{
dgCalander.Rows[i].Cells["c" + x.ToString()].Value = "";
}
}
}
private void FillCalander()
{
columnIndex = dgCalander.CurrentCell.ColumnIndex;
rowIndex = dgCalander.CurrentCell.RowIndex;
int DayOfWeekNameInMonth = 0;
int daysInMonth = pc.GetDaysInMonth(YearName, mounthName);//پیدا کردن تعدا روزهای ماه انتخاب شده
for (int i = 1, d = 1, j = 0; i <= 5; i++, j++)
{
if (d == daysInMonth)
{
break;
}
for (int x = 1; x <= 7; x++, d++)
{
DateTime dtt = pc.ToDateTime(YearName, mounthName, d, 1, 1, 1, 1, 1);
/////////////این قسمت جهت پیدا کردن اولین روز ماه استفاده میشه که مشخص میکنه اولین روز ماه از چه روزی شروع میشه
#region MyRegion
switch (pc.GetDayOfWeek(dtt))
{
case DayOfWeek.Saturday: DayOfWeekNameInMonth = 0;
break;
case DayOfWeek.Sunday: DayOfWeekNameInMonth = 1;
break;
case DayOfWeek.Monday: DayOfWeekNameInMonth = 2;
break;
case DayOfWeek.Tuesday: DayOfWeekNameInMonth = 3;
break;
case DayOfWeek.Wednesday: DayOfWeekNameInMonth = 4;
break;
case DayOfWeek.Thursday: DayOfWeekNameInMonth = 5;
break;
case DayOfWeek.Friday: DayOfWeekNameInMonth = 6;
break;
}
#endregion
dgCalander.Rows[j].Cells["c" + DayOfWeekNameInMonth.ToString()].Value = pc.GetDayOfMonth(dtt);
if (DayOfWeekNameInMonth == 6)
{
dgCalander.Rows[j].Cells["c" + DayOfWeekNameInMonth.ToString()].Style.ForeColor = Color.Red;
}
if (DayOfWeekNameInMonth == 6)
{
d++;
break;
}
if (d == daysInMonth)
{
break;
}
}
}
//////////////////// از اینجا به بعد زمانی استفاده میشود که ماه 31 روزه یا 30 روزه باشد و شروع ماه از جمعه باشد(آخر خانه سط اول)
/////////////////// که میاد به خونه های اول سطر یک اعداد رو اضافه میکنه
int lastRowData = 0;
if (dgCalander.Rows[4].Cells["c6"].Value != null)
{
if (!string.IsNullOrEmpty(dgCalander.Rows[4].Cells["c6"].Value.ToString()))
{
lastRowData = int.Parse(dgCalander.Rows[4].Cells["c6"].Value.ToString());
}
}
if (lastRowData != 31 && lastRowData != 0)
{
if (daysInMonth >= 29 && lastRowData >= 29)
{
int RemainDay = daysInMonth - lastRowData;
for (int i = 0; i < RemainDay; i++)
{
dgCalander.Rows[0].Cells["c" + i.ToString()].Value = ++lastRowData;
}
}
}
FindCurrentCell();//بعد از پر کردن لیست روز جاری با این متد پیدا میشه
}
خب دوستان میتونید کد های این دوتا متد رو ببینید که یکسری توضیحات براش نوشتم.مهمترین قسمتهای این کد رو جلوی خطهاش توضیح دادم
تعداد روزهای ماه-روز اول ماه-نمایش 30 و 31 در سطر اول در صورت جا نشدن در سطر آخر
بعد از اینکه این دوتا متد رو اضافه کردید بصورت زیر عمل کنید:
متد FillCalender رو رویداد Load فرمتون اضافه کنید
و متدهای زیر رو به همین صورتی که میبینید به رویداد کلیک ماه بعد-ماه قبل- و سال بعد سال قبل اضافه کنید
مثال:
برای سال بعد
private void btnNextY_Click(object sender, EventArgs e)
{
NextYear();
ResetCalender();
FillCalander();
}
دقت کنید که متد های کنترل ماه و سال رو تو جلسات قبل گفته بودم و این دوتا خط رو هم بهشون اضافه کنید
اول تقویم خالی میشه بعد پر میشه
خب یه متد هم مونده که میاد روز جاری رو پیدا میکنه و مقادیر رو مقدار دهی میکنه به شکل زیر
private void FindCurrentCell()
{
if (dgCalander.CurrentCell.Value != null)
{
try
{
if (!string.IsNullOrEmpty(dgCalander.CurrentCell.Valu e.ToString()))
{
this.Text = null;
selectedDay = int.Parse(dgCalander.CurrentCell.Value.ToString()) ;
selectdMonth = mounthName;
selectedYear = YearName;
selectedShamsiDate = selectedYear.ToString() + "/" +
(selectdMonth.ToString().Length == 1 ? "0" + selectdMonth.ToString() : selectdMonth.ToString()) + "/" +
(selectedDay.ToString().Length == 1 ? "0" + selectedDay.ToString() : selectedDay.ToString());
this.Text = "تقویم شمسی | تاریخ انتخاب شده : " + selectedShamsiDate;
selectedMiladiDate = pc.ToDateTime(selectedYear, selectdMonth, selectedDay, 0, 0, 0, 0);
lblShamsi.Text = selectedShamsiDate;
lblMiladi.Text = selectedMiladiDate.ToShortDateString();
}
else
{
selectedDay = 0;
selectdMonth = 0;
selectedYear = 0;
lblShamsi.Text = null;
lblMiladi.Text = null;
selectedShamsiDate = null;
selectedMiladiDate = new DateTime();
this.Text = "تقویم شمسی | تاریخ انتخاب شده : " + selectedShamsiDate;
}
}
catch (Exception)
{
return;
}
}
}
خب دوستان حالا وقتش رسیده فرمتون رو Run کنید اگه مراحل رو از اول آموزش درست رفته باشید باید بتونید تقویم رو کامل داشته باشید.
ادامه آموزش با اجازه اساتید بمونه برای روزهای بعد
خوش باشید.........
خواهشا دوستان اگه کسی احساس کرد این مطالب به دردش میخوره صلوات یادش نره ممنون
سلام دوست عزیز
کامپوننت شما به کاربر اجازه میده که تاریخ رو بصورت "YYYY/MM/dd hh:mm" انتخاب کنه؟
یعنی علاوه بر Date از Time هم پشتیبانی کنه؟
همچنان منتظر سلکت کردن یه سلول هستم ...
دنبال این دستور می گشتم
View_Calander.ClearSelection();
View_Calander.Rows[شماره سطر].Cells[شماره ستون].Selected = true;
منبع:
http://stackoverflow.com/questions/4...-specific-cell
دوست عزیز سلام
من طبق آموزش شما پیش رفتم ولی یک مشکلی که دارم اینکه بعد از لود فرم تاریخ فعلی که (مثلا 1393/09/03) رو نوار ابزار هست درسته ولی تاریخ که در دیتا گرید هست اولین روز ماه ( 1393/09/01 ) می باشد . لطفا راهنمایی کنید ممنون می شم .
آخرین ویرایش به وسیله silver189 : دوشنبه 03 آذر 1393 در 15:29 عصر
دوست عزیز رویداد Load فرمت و متد FindCurrentDate باید به شکل زیر باشه چک کن ببین درسته یا نه؟
private void frmCalander_Load(object sender, EventArgs e)
{
//Create Rows
for (int i = 0; i < 4; i++)
{
dgCalander.Rows.Add();
}
this.Text += " " + MiladiToShamsi(DateTime.Now);
FillCalander();
FindCurrentDate();
getDates();
}
private void getDates()
{
lblShamsi.Text = MiladiToShamsi(DateTime.Now);
lblMiladi.Text = DateTime.Now.ToShortDateString();
}
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;
}
}
}
}
آقا ممنون کارم راه افتاد
فقط یک سئوال شما در dll خودتون getshamsiCalander استفاده کردید . این متد رو هم اگه بگید ممنون می شم
آخرین ویرایش به وسیله silver189 : سه شنبه 04 آذر 1393 در 12:21 عصر
getshamsiCalander یه متد هستش که تاریخ انتخاب شده رو برمیگردونه دو تا مقدار برمیگردونه تاریخ شمسی و تاریخ میلادی میتونید یه نمونه ازShamsiCalander رو بسازید تا به این متد دسترسی پیدا کنید به صورت زیر
BPersianCalender.shamsiCalander shamsi = new BPersianCalender.PCalander().getshamsiCalander();
TextBox1.Text = shamsi.ShamsiDate;
آخرین ویرایش به وسیله Behnam6670 : سه شنبه 04 آذر 1393 در 17:24 عصر
با سلام
من برای یک پروژه بومیسازی دقیقا دنبال همین تاریخ شمسی هستم.
میخواستم ببینم امکان داره به نحوی تقویم شمسی رو جایگزین Calendar ویندوز در یک پروژه #C کرد؟
ممنون میشم اگر راهنمایی کنید.
سلام
من طبق اموزش شما با سلیقه شخصی دارم یک dll مثل کاری که شما کردید رو می سازم اون هم به صورت آماتور .
حالا تمام مراحل رو که فرمودید پیش رفتم و کامپونتم تقریبا تموم شده است .
Untitled.jpg
حالا من 2 تا مشکل دارم یکی اینکه هنوز نفهمیدم اون متد getshamsiCalander رو کجا استفاده کردید و یکی دیگه اینکه با بستن فرم یا دبل کلیک روی دیتاگرید چگونه اطلاعات انتقال پیدا می کنه ؟
ممنون اگه به صورت آماتوری برام توضیح بدید ؟
سلام
ما همچنان منتظر ادامه آموزش شما هستیم
آخرین ویرایش به وسیله silver189 : چهارشنبه 12 آذر 1393 در 09:33 صبح
سلام با تشکر از وقتی که میزارین
ولی کاش زودتر در مورد جستجو در بازه زمانی توضیح میدادین
سلام ، آقا ما همچنان منتظر ادامه آموزش هستیم
سلام دوست عزیز
این کامپوننتی که من گذاشتم یه Properties به نام SelectedDate داره که تاریخ انتخاب شده بدون ممیز رو توش نگه میداره به صورت زیر
1393/09/17 >>13930917
ما نمیتونیم تاریخ رو به صورت رشته ای بیایم جستجو کنیم یا باید بصورت DateTime باشه یا Int تا بتونیم بصورت بازه جستجو کنیم.
شما از طریق ای SelectedDate میتونی تاریخ رو بصورت عدد تو یه بازه جستجو کنی.
من تو پروژه هام از این کامپننتی که نوشتم خیلی راحت استفاده میکنم تاریخ رو بصورت رشته ای تو دیتابیسم ذخیره میکنم مثلا "1393/09/17" و جستجوم رو براحتی روی این رشته بصورت زیر میام انجام میدم. برای این منظور:
public static SMIODataClassDataContext db = new SMIODataClassDataContext();
SMIODataClassDataContext اسم کانتکست LINQ هستش که توی Program تعریف کردم و دسترسیش توی همه فرمها بصورت Global شده.
var Query = from p in Program.db.tblSMIOPersons
select new
{
p.fIdentity,
p.fName,
p.fFamily,
fEmpDate = p.fEmpDateS,// یه متغیری هستش که تاریخ انتخاب شده رو بصورت همون استاندارد رشته ای نگهداری میکنه1393/09/17 fEmpDate
fEmpDateS = Convert.ToInt64(p.fEmpDateS.Replace("/", "")),//تو این خط ممیزها حذف میشن و تاریخ تبدیل میشه به یه عدد
};
Query = Query.Where(c => c.fEmpDateS >= Convert.ToInt64(dateF.SelectedDate) && c.fEmpDateS <= Convert.ToInt64(dateE.SelectedDate));
کوری ساخته میشه و بازه تاریخ برای جستجو اعمال میشه.dateF و dateE دوتا کامپوننت تاریخ روی فرمم هستش
موفق باشید.
سورس کامل کامپوننت تقویم شمسی BPersianCalender و DLL
https://barnamenevis.org/showthread.p...der-%D9%88-DLL
آخرین ویرایش به وسیله Behnam6670 : سه شنبه 18 آذر 1393 در 11:58 صبح
حاجی واسه من اجرا نمیشه ...
هیچی نیست ... ولی فایل exe برنامه اجرا میشه !
نباید مشکلی داشته باشید چون دوستان زیادی استفاده کردند و به مشکلی بر نخوردند.با دقت انجام بدید
آقا بهنام مرسی خیلی عالی بود. من واقعا مشکل داشتم با این تقویما، چندتا کامپونتت پیدا کردم ولی نمیدونم چرا ادد نمیشد به پروژم. بازم مرسی.
حالت کمبوباکسشم بذاری دیگ خیلی عالی میشه دمت گرم.
با تشکر.
سلام ممنون خیلی عالیه
سلام
وقت بخیر
ممنونم از کامپوننت خوبتون
من این کامپوننت رو روی صفحه گذاشتم اما موقع اجرا خطا میده. ممنون میشم راهنمایی کنید
تشکر
1.jpg
من از کامپوننت استفاده کردم خیلی خوبه ولی یه پیغام warning به شکل زیر دارم:
WARNING.jpg