# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ > خبر: دانلود کنید: کامپوننت DatePicker فارسی با قابلیت نمایش مناسبتهای تقویم شمسی و قمری (همراه با سورس)

## Himalaya

سلام.
3، 4 روز روی ساخت یه کامپوننت DatePicker کار کردم که نتیجه رو همراه سورس اینجا قرار دادم.



اگه  کمبودی داره دیگه زحمتش با خودتون. کمبودهاشو رفع کنید و نتیجه رو مجددا  بزارید اینجا که بقیه هم استفاده کنن. (البته تا جایی که امکان داشت سعی  کردم مشکلی نداشته باشه، حالا ممکنه بعضی موارد از دستم در رفته باشه)
قبلش لازمه که یه توضیح در مورد این DatePicker بدم

1.  همونطوری که گفتم، این کامپونت قابلیت اینو داره که مناسبتهای تقویم قمری و  شمسی رو نشون بده و تعطیلات رو هم از روزهای غیر تعطیل متمایز کنه. مثلا  با بردن موس روی تاریخ 1392/01/05 مناسبتهای این روز تو قسمت پایین این  کامپوننت نمایش داده میشه



 در  مورد تاریخ شمسی هیچ مشکلی وجود نداشت. شما هر تاریخ میلادی رو بدون دردسر  و از طریق کلاس PersianCalendar میتونید تبدیل به تاریخ شمسی کنید.
اما در مورد تقویم قمری و کلاس HijriCalendar به این راحتی ها نیست. یعنی چی؟
یعنی  اینکه ممکنه شما تاریخ میلادی رو تبدیل کنید به تاریخ قمری ولی وقتی نتیجه  رو با تقویم مقایسه میکنید نتیجه 1 تا نهایتا 2 روز با اون چیزی که از  طریق کلاس HijriCalendar به دست اومده ممکنه متفاوت باشه!! چرا اینجوریه؟
عرب هستن دیگه. حساب کتاب نداره که کاراشون. میگن آقا ما چیزی رو قبول نداریم الا اینکه اون چیز رو با چشم ببینیم. مثلا میگن 



> مطابق حکم شرعی اگر هلال ماه در شامگاه بیست‌ونهم ماه رؤیت شود، آن ماه به  پایان رسیده و فردا اول ماه بعد است؛ ولی اگر هلال ماه در شامگاه روز  بیست‌ونهم رویت نشد، ماه ۳۰ روزه می‌شود


و اینجوری میشه که خیلی ها میان تاپیک میزنن که آقا چرا تو این نوع تبدیل کلاس HijriCalendar یا vs باگ داره.
باگی  نیست. اعراب محترم 2 نوع تقویم دارن. تقویم هلالی و تقویم قراردادی. (تو  همه کاراشون ار تقویم هلالی استفاده میکنن) تقویم قراردادی قمری مثل تقویم  میلادی یا شمسی یه قاعده ثابت داره و از طریق همون کلاس HijriCalendar به  دست میاد. ولی برای رفع خطای 1 یا 2 روزه تقویم هلالی، تو کلاس  HijriCalendar یه پراپرتی 
قرار دادن به اسم HijriAdjustment که تو رنج -2 تا 2 مقدار میگیره. 
بعضی  ها گفتن ما این مقدار رو هم set میکنیم ولی بازم تو ماه یا ماههای بعد  مناسبتهای تقویم قمری با تقویم شمسی جور در نمیاد. موضوع اینجاس که هر ماه  قمری HijriAdjustment مخصوص به خودش رو داره. شما نمیتونید از یک مقدار  HijriAdjustment برای کل سال قمری استفاده کنید. مثلا ممکنه برای محرم این  مقدار -1 باشه و برای صفر -2
در مورد تقویم قمری هلالی و قراردادی هم *این لینک* رو مطالعه کنید بد نیست

2.  مشکل تو تاریخ قمری فقط گزینه 1 نیست. مشکل بعدی اینه که فرضا شما برای  سال 1392 شمسی میاید و HijriAdjustment مورد نیاز رو واسه ماههای قمری تو  این سال ست میکنید. با تموم شدن سال 1392 دیگه این HijriAdjustment ها برای  سال 93 و سالهای بعدی (یا قبلی، چون تو DatePicker مطمئنا قابلیت انتخاب  سال هم وجود داره) اعتبار نداره و مجددا باید مقادیر HijriAdjustment رو از  روی تقویم برای سال جدید پیدا کنید و ست کنید. این همون کاریه که اکثر نرم  افزارهایی که با تقویم قمری کار میکنن انجام میدن. یعنی آخر سال میان یه  فایل اصلاح کننده HijriAdjustment برای سال جدید میدن به یوزرها. این فایل  میتونه یه txt یا xml باشه و کاری که یوزر باید انجام بده جایگزین کردن این  فایل با فایل قبلی هستش. من هم تو ین کامپوننت از یه فایل xml به اسم 
HijriCalendarPatch.xml  استفاده کردم که مناسبتهای تقویم قمری رو برای سال شمسی مورد نظر ست  میکنه. مشخصه که اگه سال دیگه ای جز سالی که HijriAdjustment برای اون ست  شده، توسط DataPicker مشاهده بشه، مناسبتهای سال قمری یکی دو روز اینور  اونور میشه نسبت به تقویم اصلی.
کافیه واسه سال شمسی جدید این فایل رو  با notepad باز کنید و مقادیر رو برای هر ماه اصلاح کنید. دقت کنید که فرمت  باید به شکل زیر باشه و فقط مقادیر اصلاح بشن. در غیر این صورت مناسبتهای  تقویم قمری اصلا درنظر گرفته نمیشن.


```
<?xml version="1.0" encoding="utf-8" ?>
<months>
  <month key="1" value="-1" />       <!--محرم-->
  <month key="2" value="0" />        <!--صفر-->
  <month key="3" value="-1" />        <!--ربیع الاول-->
  <month key="4" value="0" />        <!--ربیع الثانی-->
  <month key="5" value="-1" />       <!--جمادی الاول-->
  <month key="6" value="-1" />       <!--جمادی الثانی-->
  <month key="7" value="-2" />       <!--رجب-->
  <month key="8" value="-1" />       <!--شعبان-->
  <month key="9" value="-2" />       <!--رمضان-->
  <month key="10" value="-2" />      <!--شوال-->
  <month key="11" value="-2" />      <!--ذیقعده-->
  <month key="12" value="-2" />      <!--ذالحجه-->
</months>
```

3. اما نحوه ست کردن value ها تو فایل HijriCalendarPatch.xml برای ماههای قمری و برای ست شدن مناسبتها با سال شمسی مورد نظر
مواد مورد نیاز: یک عدد تقویم سال شمسی مورد نظر (مثلا تقویم سال 1392 که تو فایل ضمیمه قرار دادم)
و 5 الی 10 دقیقه وقت و حوصله. و اما نحوه کار
تو  ماه فروردین سال 1392 (اولین ماه تقویم شمسی) از روی تقویمی که دارید، یکی  از مناسبتهای مربوط به تاریخ قمری رو پیدا کنید (البته ممکنه مثلا از نیمه  فروردین ماه، ماه قمری تغییر کنه که به این نکته هم توجه داشته باشید) بعد  ببینید معادل تاریخ شمسی اون مناسبت چه تاریخی هستش (مثلا 13 جمادی الاول  که شهادت حضرت فاطمه (س) به روایتی هستش، میشه معادل 5 فروردین 1392 (اگه  بدون  HijriAdjustment این تاریخ رو به دست بیارید میشه 4 فروردین). خوب  چون مناسبت متعلق یه ماه  جمادی الاول هستش (ماه 5 از تقویم قمری) پس یعنی  میخوایم مقدار value رو برای خط زیر تو فایل HijriCalendarPatch.xml به دست  بیاریم (فرض میکنیم دیفالت همه value ها تو فایل  HijriCalendarPatch.xml  برابر 0 هستش)


```
<month key="5" value="-1" />       <!--جمادی الاول-->
```

یه  کامپوننت DatePicker رو فرم قرار میدیم و برنامه رو اجرا میکنیم.  DatePicker رو باز میکنیم و موس رو میبریم رو 5 فروردین 1392. نگاه میکنیم  اگه پایین کامپوننت مناسبت مورد نظر ظاهر شد که یعنی مناسبتهای ماه جمادی  الاول برای سال شمسی 1392 با همون HijriAdjustment دیفالت (یعنی 0) ست میشه  و نیازی به تغییر value برای این ماه نیست. ولی اگه مناسبت مورد نظر ظاهر  نشد، موس رو تو رنج 1392/01/03 الی 1392/01/07 حرکت میدیم تا اون مناسبت رو  پیدا کنیم (2 روز کمتر یا بیشتر) مثلا اگه مناسبت افتاده بود رو تاریخ  1392/01/04 این یعنی اینکه تاریخ قمری برای ماه جمادی الاول تو سال 1392  باید 1 روز بره جلوترتا بیافته رو 5 فروردین. برای جلو بردنش هم از مقدار  -1 استفاده میکنیم (1- یک رو جلو میره -2 دو رو جلو میره. 0 بدون تغییر و 1  و 2 هم به ترتیب 1و2 روز به عقب میره).
برای باقی ماههای قمری هم به همن صورت عمل میکنیم. 
فایل HijriCalendarPatch.xml که همراه پروژه هستش و محتواش رو هم بالا قرار دادم، برای سال 92 تنظیم شده.
این فایل باید کنار exe برنامه باشه

4.  برنامه همه مناسبتهای تقویم شمسی و قمری رو از فایل DayEvents.xml که تو  Resources این کامپوننت قرار گرفته میخونه. قالب این فایل به این صورت هستش



```
<?xml version="1.0" encoding="utf-8" ?>
<calendars>
  <calendar name="Persian">
    <day month="1" day="1" isHoliday="1" event="روز اول عید نوروز" />
    <day month="1" day="2" isHoliday="1" event="روز دوم عید نوروز - آغاز عملیات فتح المبین" />
    <day month="1" day="2" isHoliday="1" event="هجوم ماموران ستم شاهی به مدرسه فیضیه قم" />
  </calendar>
  <calendar name="Hijri">
    <day month="1" day="1" isHoliday="0" event="آغاز سال جدید هجری قمری" />
    <day month="1" day="9" isHoliday="1" event="تاسوعای حسینی" />
    <day month="1" day="10" isHoliday="1" event="عاشورای حسینی" />
    <day month="1" day="12" isHoliday="0" event="شهادت حضرت امام زین العابدین علیه السلام" />
    <day month="1" day="25" isHoliday="0" event="شهادت حضرت امام زین العابدین علیه السلام به روایتی" />
    <day month="2" day="7" isHoliday="0" event="ولادت حضرت امام موسی کاظم علیه السلام" />
  </calendar>
</calendars>
```

البته  این واسه نمونه هستش و فایل اصلی اکثر مناسبتها توش قرار داره. اگه  خواستید مناسبتهای دیگه رو بهش اضافه کنید، دقت کنید که مناسبتهای تقویم  شمسی تو بخش اول و مناسبتهای تقویم قمری تو بخش دوم درج بشه. تو بخش اول  منظور از month ماه شمسی و تو بخش دوم ماه قمری هستش.

5. کلاس FarsiDateHelper هم شامل یه سری توابع کمکی هست که میتونید از اونها هم تو پروژه خودتون استفاده کنید

پروژه  ضمیمه شده هم شامل سورس کامپوننت و هم یه برنامه برای تست کامپوننت هستش.  با vs 2012 نوشته شده. تو ورژنهای پایین تر هر پروژه رو به صورت جداگانه و  از طریق فایل csproj. اجرا کنید

موفق باشید

----------


## aslan

> HijriCalendarPatch.xml استفاده کردم که مناسبتهای تقویم قمری رو برای سال شمسی مورد نظر ست میکنه. مشخصه که اگه سال دیگه ای جز سالی که HijriAdjustment برای اون ست شده، توسط DataPicker مشاهده بشه، مناسبتهای سال قمری یکی دو روز اینور اونور میشه نسبت به تقویم اصلی.
> کا


سلام
با تشکر از شما
با توجه به نقل قول بالا بهتر نیست که از یک فایل برای سالهای متمادی استفاده بشه ؟ یعنی فایل xml  بجز ماهها شامل سال ها هم باشه ؟

----------


## Himalaya

سلام




> با توجه به نقل قول بالا بهتر نیست که از یک فایل برای سالهای متمادی استفاده 
> بشه ؟ یعنی فایل xml  بجز ماهها شامل سال ها هم باشه ؟


وقتی میشه این کار رو کرد که دقیقا بدونیم مناسبتهای تقویم قمری تو سالهای شمسی بعدی (و قبلی، که البته سالهای قبل رو از روی تقویم های موجود میشه بدست آورد)، دقیقا  (و نه با حدس و محاسبات احتمالی) تو چه روزی میافته. چون تقویم سال 1392 همراه با مناسبتهای قمری موجود هستش، خوب این کار واسه سال 92 و سالهای قبل شدنی هستش. ولی اگه این تقویم موجود نباشه باید منتظر موند. (منظورم موجود بودن تقویم قمری نیست. این تقویم رو که تا هر سالی بخوایم میتونیم از رو کلاس HijriCalendar به دست بیاریم. منظورم تقویم رسمی و دقیقی هست که دقیقا مشخص کنه روز x از ماه y تو سال z شمسی دقیقا معادل چه روزی از تقویم قمری هستش. و چون مناسبتها مربوط به تقویم قمری هلالی هستن، حتی در مورد آخر همین ماه قمری که الان توش هستیم هم با قطعیت نمیشه حرف زد چه برسه به آخر سال یا سالهای بعد. ما با اون فایل xml اومدیم معادل تقویم رسمی سال 92 که الان موجوده ایجاد کردیم، حتی ممکنه این تقویم هم مثلا تو محاسبه روز عید فطر اشتباه باشه، با این حال فرض بر این هستش که درست باشه (مگه خلافش ثابت بشه، که اونوقت باید HijriAdjustment  ماه مورد نظر مجددا تغییر کنه))

----------


## aslan

> سلام
> 
> 
> 
> وقتی میشه این کار رو کرد که دقیقا بدونیم مناسبتهای تقویم قمری تو سالهای شمسی بعدی (و قبلی، که البته سالهای قبل رو از روی تقویم های موجود میشه بدست آورد)، دقیقا  (و نه با حدس و محاسبات احتمالی) تو چه روزی میافته. چون تقویم سال 1392 همراه با مناسبتهای قمری موجود هستش، خوب این کار واسه سال 92 و سالهای قبل شدنی هستش. ولی اگه این تقویم موجود نباشه باید منتظر موند. (منظورم موجود بودن تقویم قمری نیست. این تقویم رو که تا هر سالی بخوایم میتونیم از رو کلاس HijriCalendar به دست بیاریم. منظورم تقویم رسمی و دقیقی هست که دقیقا مشخص کنه روز x از ماه y تو سال z شمسی دقیقا معادل چه روزی از تقویم قمری هستش. و چون مناسبتها مربوط به تقویم قمری هلالی هستن، حتی در مورد آخر همین ماه قمری که الان توش هستیم هم با قطعیت نمیشه حرف زد چه برسه به آخر سال یا سالهای بعد. ما با اون فایل xml اومدیم معادل تقویم رسمی سال 92 که الان موجوده ایجاد کردیم، حتی ممکنه این تقویم هم مثلا تو محاسبه روز عید فطر اشتباه باشه، با این حال فرض بر این هستش که درست باشه (مگه خلافش ثابت بشه، که اونوقت باید HijriAdjustment  ماه مورد نظر مجددا تغییر کنه))


سلام
ممنون از توضیحاتتون
من هم دقیقا منظورم برای روزها و سالهایی بود که موضوع اختلاف معلوم شده . ( یعنی تاریخ گذشته .... )
در واقع اگر برای روزها و سالهای بعد هم معلوم بود که اینهمه حرف و حدیث مثلا برای پایان ماه رمضان هر سال تکرار نمیشد !!!!
بهر حال بنظر من وجود نود سال در فایل xml  برای سالهای قبل خالی از لطف نیست
موفق باشید

----------


## Himalaya

> دکمه تشکر جوایگوی زحمات شما نمی شه از شما بی نهایت تشکر میکنم


ممنون. لطف دارید



> بهر حال بنظر من وجود نود سال در فایل xml  برای سالهای قبل خالی از لطف نیست


درسته ولی واقعا حوصله میخواد بشینی واسه مثلا 90 سال این کار رو انجام بدی. (طرف بیشتر باید تایپیست باشه تا برنامه نویس) تازه اونوقت یکی میاد میگه آقا این واسه 91 سال قبل مناسبتهاش درست نیست. حالا یا باید طرفو قانع کنی یا بشینی xml تا n سال قبل رو براش تهیه کنی.

----------


## majidv

مرسی.....فقط یه مشکلی داره.من فایلهای xml رو تغییر میدم ولی توی dll که تو برنامه استفاده می کنم تغییر نمی کنه. فقط توی Testcontrol تغییر می کنه..

----------


## vahidth

داداش سوال من مبتدیه ولی چطوری اجراش کنم وقتی اجرا میکنم ارور میده

----------


## khoshkhu

خیلی زحمت کشیدی
ممنون
من دو تا مشکل داخلش دیدم 
1- وقتی فاکوس ازش گرفته میشه بسته نمیشه
2- اگه پایین فرم قرار داده بشه وقتی تقویم باز بشه روی فرم قرار نمی گیره 
البته بچه ها زحمت میکشن درستش میکن
من هم سعی میکنم در اولین فرصت درستش کنم

----------


## mohammad2407

سلام تقویم زیبا و پر کاربردی هست 

فقط یک سوال چه جوری میشه کاری کرد که تقویم به صورت عادی باز باشه یعنی دیگه روی اون علامت فلش کلیک نکنیم

----------


## Himalaya

سلام




> فقط یه مشکلی داره.من فایلهای xml رو تغییر میدم ولی توی dll که تو برنامه  استفاده می کنم تغییر نمی کنه. فقط توی Testcontrol تغییر می کنه..


اگه منظورت xml ای هست که تو ریسورس قرار گرفته، پروژه مربوط به کنترل رو 1 بار rebuild کن و dll رو مجددا اضافه کن به پروژه خودت.



> داداش سوال من مبتدیه ولی چطوری اجراش کنم وقتی اجرا میکنم ارور میده


اگه منظورت اینه که پروژه باز نمیشه، تو پست 1 گفتم
پروژه  ضمیمه شده هم شامل سورس کامپوننت و هم یه برنامه برای تست کامپوننت  هستش.  با vs 2012 نوشته شده. تو ورژنهای پایین تر هر پروژه رو به صورت  جداگانه و  از طریق فایل csproj. اجرا کنید
اگه نشد پروژه رو تو vs خودتون ایجاد کنید (یه کم حوصله میخواد)




> من دو تا مشکل داخلش دیدم 
> 1- وقتی فاکوس ازش گرفته میشه بسته نمیشه
> 2- اگه پایین فرم قرار داده بشه وقتی تقویم باز بشه روی فرم قرار نمی گیره 
> البته بچه ها زحمت میکشن درستش میکن
> من هم سعی میکنم در اولین فرصت درستش کنم


مراجعه به پست 18

----------


## linux

دیدم که از دیتاگرید استفاده کردید. این کار زیاد جالب نیست.

----------


## Himalaya

سلام



> دیدم که از دیتاگرید استفاده کردید. این کار زیاد جالب نیست.


دلیل؟ همینطوری که رو هوا نمیشه گفت جالب نیست. 
یکی میاد به جای گرید یه کلاس اختصاصی مینویسه مثلا به اسم CellInfo و با یه پراپرتی از نوع Rectangle (مشخصه طول و عرض سلول) و یک پراپرتی دیگه از نوع String (واسه Value اون سلول) و خلاصه  انواع و اقسام پراپرتی های دیگه. و یه List از CellInfo ایجاد میکنه و در نهایت با استفاده از شیء گرافیک شروع میکنه به رسم عناصر تو ناحیه مورد نظر و همه چیز رو هم مجبوره خودش هندل میکنه (جایی که پای ترسیمات در میون باشه مجبوره)

یکی دیگه میاد مثلا به جای همون کلاس CellInfo یه آرایه در نظر میگیره از Button ها (نمونه این DatePicker رو چند روز پیش یکی از بچه ها گزاشته بود) یا یه آرایه از Button های اختصاصی که خود طرف طراحی کرده. مثلا برای روزها یه آرایه 42 تایی و واسه ماهها یه آرایه 12 تایی و ... در نهایت میاد ایونت مورد نظر رو هم واسه هر کدوم تعریف میکنه و این کنترلهارو سر جای خودشون میچینه و تموم

خوب مگه قراره هر کاری این بنده های خدا انجام دادن بقیه هم انجام بدن؟  حالا من اینجا اومدم از گرید استفاده کردم که به انواع و اقسام حالت ها میشه فرمت بندیش کردو دقیقا همون چیزی هست که مورد نیازه، بدون درگیر شدن با جزئیات روش اول (که خیلی کد نویسی داره و واسه کوچیک ترین موضوع باید کد نوشت)  و بدون اینکه کنترل بیریختی به روش دوم تولید کنیم (میشه با این روش هم DatePicker زیبا تولیدکرد که اونم مشکلات خودشو داره.)

خلاصه اینکه کنترل گرید به نظرم کم دردسر ترین حالت واسه تولید این DatePicker هستش (چه از نظر برنامه نویسی و چه از نظر حجم کدایی که برنامه نویس مجبوره بنویسه)
نمیدونم شاید منظورتون این باشه که کنترل DataGridView واسه یه کار کوچولو مثل این، یه کم زیادی بزرگه (یا سنگینه  خلاصه مناسب این کار نیست) که موافق نیستم با این حرف به دلایلی که عرض کردم

موفق باشید

----------


## khoshkhu

باز هم ازت تشکر میکنم
ولی اگه popup مثل popup کامپونت DateTimePicker خود سی شارپ باز بشه بهتره

----------


## Himalaya

سلام



> ولی اگه popup مثل popup کامپونت DateTimePicker خود سی شارپ باز بشه بهتره


آخرین ورژن رو ضمیمه پست 1 کردم. تو این ورژن از کنترل Popup استفاده شده که سورس این کنترل هم تو پروژه وجود داره. مشکلایی که تو پست 14 در موردشون گفتم توسط این کنترل حل شد.



> فقط یک سوال چه جوری میشه کاری کرد که تقویم به صورت عادی باز باشه یعنی دیگه روی اون علامت فلش کلیک نکنیم


چند تا تغییر تو آخرین ورژن انجام شده که اینا هستن

01.jpg

1. یه پراپرتی به زیر مجموعه پراپرتی Value اضافه شده به اسم Mode. دو تا مقدر میگیره. مقدار DatePicker که باعث میشه تقویم توسط یک ComboBox (همون کنترل Popup) نمایش داده بشه و مقدار 
MonthCalendar که تقویم رو بدون ComboBox و به صورت ثابت نمایش میده
2. تو پروژه یه کلاس تعریف شده به اسم DataGridViewFarsiDatePickerColumn. اگه Dll مربوط به کنترل رو به پروژتون اضافه کنید و یه گرید بزارید رو فرمتون، تو بخش تعریف ستونها، یه ستون از همین نوع اضافه شده. از پنجره پراپرتی های این نوع ستون میتونید به 3 پراپرتی DateFormat و ShowFarsiDigitInCell و Theme دسترسی داشته باشید. اولی که نوع متن رو تو سلول و DatePicker مشخص میکنه و دومی اعداد موجود تو سلول رو فارسی میکنه (در صورت true بودن و تو هر 2 حالت Long و Short) و سومی Theme تقویم رو در زمان ویرایش تاریخ مشخص میکنه (Blue و Gold). البته میتونید برای هر سلول تو این نوع ستون، مقادیر این پراپرتی ها رو تغییر بدید. مثلا سلول اول دارای Theme برابر Blue باشه و سلول بعدی Gold. این کار از طریق کد نویسی و استفاده از کلاس DataGridViewFarsiDatePickerCell قابل انجامه

03.jpg

----------


## morteza.azad

با سلام و تشکر فراوان از کامپوننت کاربردیتون
ی سوال داشتم. میخواستم بدونم چطور میشه روزهای تعظیل رو تشخیص داد، آیا پروپرتی ای واسه این درنظر گرفته شده یا نه؟ من خیلی به این مسئله نیازمندم.
با تشکر از شما

----------


## Himalaya

سلام



> ی سوال داشتم. میخواستم بدونم چطور میشه روزهای تعظیل رو تشخیص داد، آیا  پروپرتی ای واسه این درنظر گرفته شده یا نه؟ من خیلی به این مسئله  نیازمندم.


تغییرات (FarsiCalendar (v4
1. اضافه شدن 2 Theme دیگه (Green , WhiteSmoke)

01.jpg

2. اضافه شدن بخش Designer که میتونید پراپرتی ها رو از طریق بخش smart tag تنظیم کنید
3. انتخاب تاریخ شمسی مورد نظر (انتخاب پیش فرض روز) از طریق باز شدن تقویم تو پراپرتی FarsiSelectedDate و یا گزینه Selected Date تو smart tag (تو ورژنهای قبل باید تاریخ تایپ میشد و احتمال داشت 
    تاریخ درستی انتخاب نشه. هرچند این حالت کنترل شده بود)

02.jpg

4. اضافه شدن تابع IsHolidayFarsiDate تو کلاس FarsiDateHelper که تاریخ شمسی دریافت میکنه و مشخص میکنه این روز تعطیل هست یا نه
5. اضافه شدن ایونت CellDateChanged به ستون DataGridViewFarsiDatePickerColumn که در صورت نیاز میتونید از طریق کدنویسی این ایونت رو استفاده کنید
مثلا تو فرم لود داریم
BirthDate.CellDateChanged += BirthDate_CellDateChanged;
و پیاده سازی ایونت
        void BirthDate_CellDateChanged(DataGridViewFarsiDatePic  kerCell cell, FarsiDatePickerEventArgs e)
        {
            MessageBox.Show(string.Format("Cell[{0},{1}] \r\n Old FarsiDate: {2} \r\n New FarsiDate: {3}", cell.RowIndex,
                                          cell.ColumnIndex, e.OldFarsiDate, e.NewFarsiDate));
        }

ورژن 4 رو از پست 1 دانلود کنید

----------


## mzzzzzzz

یه سوال داشتم  اونم اینه که من میخوام مقدار تقویم جای خالی باشه .این تقویم همچنین قابلیتو داره؟

----------


## Himalaya

سلام



> یه سوال داشتم  اونم اینه که من میخوام مقدار تقویم جای خالی باشه .این تقویم همچنین قابلیتو داره؟


تاریخی انتخاب نشه، تاریخ جاری سیستم به عنوان تاریخ پیشفرض در نظر گرفته میشه.
اسم قابلیت که نمیشه به این مورد داد. بالاخره وقتی DatePicker استفاده میکنی یعنی نیاز داری یه تاریخ انتخاب بشه. پراپرتی Value از کنترل DateTimePicker  خود دات نت هم حتما باید مقدار بگیره. اینم به همون صورت. تو کنترل خود دات نت با Set کردن پراپرتی ShowCheckBox=true و بعد از طریق کد dateTimePicker1.Checked میشه تشخیص داد که کاربر قصد انتخاب تاریخ داشته یا نه.
شما هم با یه چک باکس همین کار رو انجام بدید. اگه تیک خورد، DatePicker رو فعال و اگه تیک برداشته شد کنترل رو غیر فعال کنید و مثلا زمان ذخیره تاریخ، برسی کنید که این چک باکس تو چه حالتی هستش. اگه تیک نداشت، مقدار پیش فرض خودتون رو مد نظر قرار بدید

موفق باشید

----------


## sarbandi

ممنون بابت کامپوننت بسیار زیبایی که ایجاد کردید
همه نکات را رعایت کردید اما اگر datapicker خود net. را دیده باشی به صورت دستی هم می توان داخل آن مقدار ریخت و اینکه از کلیدهای بالاو پایین می توان جهت کم یا زیاد کردن روز و ماه وسال استفاده کرد همانطور که می دانید کاربرانی که از صفحه کلید در ویندوز جهت ثبت استفاده می کنند اصلا دوست ندارند که از موس استفاده کنند و باعث کندی کار میشه
البته این نظر شخصی من بود جهت بهبود کامپوننت
با تشکر

----------


## Himalaya

سلام



> ممنون بابت کامپوننت بسیار زیبایی که ایجاد کردید
> همه نکات را رعایت کردید اما اگر datapicker خود net. را دیده باشی به صورت  دستی هم می توان داخل آن مقدار ریخت و اینکه از کلیدهای بالاو پایین می  توان جهت کم یا زیاد کردن روز و ماه وسال استفاده کرد همانطور که می دانید  کاربرانی که از صفحه کلید در ویندوز جهت ثبت استفاده می کنند اصلا دوست  ندارند که از موس استفاده کنند و باعث کندی کار میشه
> البته این نظر شخصی من بود جهت بهبود کامپوننت
> با تشکر


یه دوست دیگه هم با پیام خصوصی این موارد رو گفته بود



> با سلام 
> با تشکر از شما بابت تقویم زیبای شما
> ایا امکان داره تو تقویم وقتی از datepicker استفاده می کنیم به صورت دستی تایپ کرد شما تایپ دستی رو بستید


جوابی که دادم:
میشه تایپ دستی هم قرار داد. فایل FarsiCalendar رو تو پروژه AmirCalendar  تو حالت دیزاین باز کن و از پنجره پراپرتیها کنترل popupDatePicker انتخاب  کن و پراپرتی DropDownStyle رو روی DropDown بزار. پروژه رو کامپایل کن و  از Dll جدید استفاده کن. ولی .....
اول اینکه بهتره که تایپ نکنه تا تاریخ اشتباهی وارد نشه که حالا مجبور  باشیم اون رو هندل کنیم. حالا به جای تایپ تو خود DropDown کاربر تو  NumericUpDown هایی که استفاده شده تایپ کنه. زودتر هم به نتیجه میرسه
دوم اینکه فقط با set کردن پراپرتی گفته شده کارتون راه نمیافته چون من  مقدار FarsiSelectedDate رو تو ایونت CellClick از گرید Set کردم و تغییر  تکست DropDown کار این ایونت رو انجام نمیده و مجبورید ایونت   popupDatePicker.TextChange رو خودتون طبق ایونت CellClick گفته شده  بنویسید و البته تمام کنترلهای لازم رو هم برای وارد نشدن تاریخ اشتباه  انجام بدید.

مجددا گفتن



> میدونی برای چی این قضیه رو گفتن چون من یه مدت بود ار تقویم تلریک استفاده  می کردم داخل تقویم تلریک با کلید بالا و پایین می تونیم تاریخ رو کم  وزیاد کنیم و اینکه به راحتی عدد وارد کنیم وقتی تاریخ رو به شمسی تبدیل می  کردم کلید بالا وپایین خوب کار می کرد یعنی وقتی من روز ها را بالا می  بردم وقتی ماه سی روز بود بعد از سی روز دیگه 31 نمی شد و یه عدد به ماه  اضافه می شدتنها مشکلی که داره اینه وقتی حالت شمسی هست به صورت دستی وارد  می کنیم اشتباه میزنه یه عدد دیگه ولی میلادی جواب میده
> شما خیلی تقویم بسیار عالی درست کردید واقعا داخل .net همچین تقویمی نیاز  است اما وقتی کاربر با صفحه کلید کار میکنه دیگه دوست نداره که از موس  استفاده کنم اگه کاربر بتونه تو همون لحظه تایپ کنه وبره سراغ کنترل بعدی  البته این نظرم من بود (اگه این دو قسمت که گفتم داشته باشه دیگه هیچی کم  نداره)
> بازم از شما متشکرم بابت این تقویم بسیار زیبا مخصوصا که روز های تعطیل هم داخل اون هست


و جواب:
واسه کار با کیبورد
فایل FarsiCalendar رو تو حالت دیزاین باز کن و از پنجره پراپرتی کنترل  Popup رو انتخاب کن و ایونت های KeyDown و KeyUp رو ایجاد کن براش و 3 تا  متغیر تعریف کن مثلا به اسم _yPress, _mPress, _dPress از نوع bool که نشون  میدن کدوم کلید الان فشرده شده (Y/M/D). تو keyDown از مقدار e.KeyCode  استفاده کن و با یه سویچ کیس تشخیص بده کدوم یکی از این  3 تا فشرده شده و  متغیر مربوط به اون رو true کن. تو ایونت KeyUp هم از همین استفاده کن و  اینبار مقدار کلیدی که رها شده رو false کن.
تو ادامه کدای keyDown یه سویچ کیس دیگه قرار بده و 2 حالت e.keyCode =  Keys.Up و Keus.Down رو بررسی کن و داخل هر کدوم 3 تا if که مشخص میکنه  کدوم قسمت تاریخ باید تغییر کنه. اگه yPress_ برابر true بود، تو بخش  Keys.up یعنی سال رو باید 1 واحد ببری جلو. یعنی
((Value.SelectedFarsiDate = FarsiDateHelper.GetShortFarsiDate(Value.GregorianS  electedDate.AddYear(1
واسه yPress_ برابر true و Keys.Down هم همین کد رو استفاده میکنی فقط به جای 1 میزازی 1-
این واسه سال.
واسه ماه هم از mPress_ و برای روز هم از dPress_ استفاده میکنی. 
در اصل با ترکیب کلیدهای Y + Up/Down مقدار سال و کلیدهای M +Up/Down مقدار ماه و کلیدهای D + Up/Down مقدار روز رو تغییر میدیم.
10و 15 خط کد بیشتر نیست. پیاده سازیش با خودتون

خلاصه اینکه من کدهای این کامپوننت رو هم قرار دادم که دوستان هم اگه شد روش کار کنن و اون چیزایی که مد نظرشون هست رو بهش اضافه کنن و بزارن اینجا واسه استفاده بقیه
به هر حال، کار با کیبورد رو هم به این کامپوننت اضافه کردم. کلاس FarsiCalendar رو که تو همین پست پیوست کردم کافیه جایگزین فایل FarsiCalendar.cs بشه. بعدش پروژه رو یک بار کامپایل کنید و از کامپوننت استفاده کنید
تو حالت DatePicker طبق گفته قبلی، بخشهای تاریخ رو میتونید کم و زیاد بکنید



> با ترکیب کلیدهای Y + Up/Down مقدار سال و کلیدهای M +Up/Down مقدار ماه و کلیدهای D + Up/Down مقدار روز رو تغییر میدیم


موفق باشید

----------


## FastCode

خیلی قشنگه و باید بگم من هم همون مشکلی رو دارم که لینوکس داره.
دیتا گرید اصلا جالب نیست.چون توی لینوکس نوشته هاش خراب میشه.البته یک سالی میشه که تست نکردم ولی باید هنوز هم همین مشکل رو داشته باشه.
متاسفانه الان فرصت تست ندارم ولی اگر گرید رو درست کنم براتون نسخه اصلاح شده رو میفرستم.

----------


## Himalaya

سلام. 



> خیلی قشنگه و باید بگم من هم همون مشکلی رو دارم که لینوکس داره. دیتا گرید 
> اصلا جالب نیست.چون توی لینوکس نوشته هاش خراب میشه.البته یک سالی میشه که تست نکردم ولی باید هنوز هم همین مشکل رو داشته باشه.
> متاسفانه الان فرصت تست ندارم ولی اگر گرید رو درست کنم براتون نسخه اصلاح شده رو میفرستم.


راستش واسه من بیشتر کار کردن کامپوننت تو ویندوز مهم هستش و نه لینوکس. 
با این حال اگه تو لینوکس هم بشه ازش استفاده کرد که عالی میشه

----------


## FastCode

من خودم شخصا به چنین کامپوننتی در لینوکس شدیدا نیاز دارم چون در ویندوز یک کاپپوننت شبیه همین ساختم که اون هم همین مشکل رو در لینوکس داره.
من در نظر دارم به جای DataGridView از OpenTK و OpenGL ES 2 و در صورت امکان OpenGL ES 1 استفاده کنم.
ولی فعلا اصلا وقت ندارم.شاید تا چند ماه دیگه هم بهش نرسم.چون خیلی کم OpenGL بلدم و کار با OpenTK رو تازه شروع کردم.

یکی دو ساله که دارم از ویندوز مهاجرت میکنم به لینوکس. کلا همه چیز رو از اول نوشتم.ولی هنوز همینطوری گرفتارشم.:sad:

----------


## sarbandi

> سلام
> 
> یه دوست دیگه هم با پیام خصوصی این موارد رو گفته بود
> 
> جوابی که دادم:
> میشه تایپ دستی هم قرار داد. فایل FarsiCalendar رو تو پروژه AmirCalendar  تو حالت دیزاین باز کن و از پنجره پراپرتیها کنترل popupDatePicker انتخاب  کن و پراپرتی DropDownStyle رو روی DropDown بزار. پروژه رو کامپایل کن و  از Dll جدید استفاده کن. ولی .....
> اول اینکه بهتره که تایپ نکنه تا تاریخ اشتباهی وارد نشه که حالا مجبور  باشیم اون رو هندل کنیم. حالا به جای تایپ تو خود DropDown کاربر تو  NumericUpDown هایی که استفاده شده تایپ کنه. زودتر هم به نتیجه میرسه
> دوم اینکه فقط با set کردن پراپرتی گفته شده کارتون راه نمیافته چون من  مقدار FarsiSelectedDate رو تو ایونت CellClick از گرید Set کردم و تغییر  تکست DropDown کار این ایونت رو انجام نمیده و مجبورید ایونت   popupDatePicker.TextChange رو خودتون طبق ایونت CellClick گفته شده  بنویسید و البته تمام کنترلهای لازم رو هم برای وارد نشدن تاریخ اشتباه  انجام بدید.
> 
> ...


شاید منظورم را درست نرسونده باشم
اگر عکس زیر رو نگاه کنید تاریخ سه حالت فوکوس داره که الان فوکوس روی ماه قرار گرفته اگر به صورت دستی تایپ کنم ماه تغییر میکنه و اگر از کلید بالا و پایین استفاده کنم ققط ماه تغییر میکنه حال اگر خواسته باشم سال یا روز رو تغییر بدهم می تونم با کلیدهای راست وچپ فوکوس ررا روی روز و سال ببرم و انها را تغییر بدهم
موفق باشید

1.jpg

----------


## Himalaya

سلام



> شاید منظورم را درست نرسونده باشم
>  اگر عکس زیر رو نگاه کنید ...


چرا فهمیدم و عرض کردم که



> اگه  کمبودی داره دیگه زحمتش با خودتون. کمبودهاشو رفع کنید و نتیجه رو مجددا بزارید اینجا که بقیه هم استفاده کنن


و


> خلاصه اینکه من کدهای این کامپوننت رو هم قرار دادم که دوستان هم اگه شد روش کار کنن و اون چیزایی که مد نظرشون هست رو بهش اضافه کنن و بزارن اینجا واسه استفاده بقیه





> میشه تایپ دستی هم قرار داد. فایل FarsiCalendar رو تو پروژه AmirCalendar  تو حالت دیزاین باز کن و از پنجره پراپرتیها کنترل popupDatePicker انتخاب  کن و پراپرتی DropDownStyle رو روی DropDown بزار. پروژه رو کامپایل کن و  از Dll جدید استفاده کن (+ کنترل متنی که تایپ میشه) و ...


از همون اول که شروع به طراحی این کامپوننت کردم، هدفم این بوده که کاربر مطلقا چیزی داخل کمبو تایپ نکنه و فقط انتخاب کنه. حالا اگه میبینید نیازتون رو برآورده نمیکنه بسم الله، تغییرش بدید

موفق باشید

----------


## jadidian

چه جوري تاريخ ذخيره شده را در تقويم نمايش بدهيم مثلا ميخوام تقويم 1392/03/05 را نشون بده ؟

----------


## sh

سلام دوست عزیز

لطف میکنین راجع به نحوه انجام مورد زیر که در پست 20 مطرح کردید توضیح بدید که چه تغییراتی دادید تا این حالت درست شد ؟




> . انتخاب تاریخ شمسی مورد نظر (انتخاب پیش فرض روز) از طریق باز شدن تقویم تو پراپرتی FarsiSelectedDate و یا گزینه Selected Date تو smart tag (تو ورژنهای قبل باید تاریخ تایپ میشد و احتمال داشت

----------


## Himalaya

سلام




> چه جوري تاريخ ذخيره شده را در تقويم نمايش بدهيم مثلا ميخوام تقويم 1392/03/05 را نشون بده ؟


اگه تاریخ شمسی باشه از datapicker.Value.FarsiSelectedDate برای ست کردن تاریخ استفاده میشه. واسه ست کردن تاریخ از طریق تاریخ میلادی هم یه تغییر کوچولو داریم
        /// <summary>
        /// Gets or sets the gregorian date value assigned to the control.
        /// </summary>
        [Browsable(false)]
        public DateTime GregorianSelectedDate
        {
            get { return FarsiDateHelper.GetGregorianDate(FarsiSelectedDate  ); }
            set { FarsiSelectedDate = FarsiDateHelper.GetShortFarsiDate(value); }
        } 
بعدش از datapicker.Value.GregorianSelectedDate واسه ست کردن تاریخ از طریق تاریخ میلادی استفاده کنید.





> لطف میکنین راجع به نحوه انجام مورد زیر که در پست 20 مطرح کردید توضیح بدید که چه تغییراتی دادید تا این حالت درست شد ؟


کلاس FarsiCalendarDesigner و معرفی این کلاس توسط  اتریبیوت Designer، به کلاس FarsiCalendar، بخش smart tag رو ایجاد میکنه
کلاس TypeEditor و معرفی این کلاس توسط اتریبیوت Editor، به پراپرتی FarsiSelectedDate، باعث میشه زمان انتخاب این پراپرتی، تقویم باز، و بشه ازش یه تاریخ انتخاب کرد

موفق باشید

----------


## sh

دوست عزیز در ادامه توضیحات بالا عملکرد این کنترل در خصوص موارد زیر به چه صورت است.
چنانچه تاریخ میلادی در دیتا بیس ذخیره باشد و این کنترل از طریق پروپرتی GregorianSelectedDate به ستون مربوطه در دیتابیس توسط  dataset بایند باشد ، اگر تاریخ فارسی را تغییر دهیم آیا قابلیت این را دارد که تاریخ میلادی را در فیلدی که به آن بایند شده نیز تغییر دهد ؟ یا صرفا تاریخ میلادی بایند شده را بصورت فارسی آن نمایش می دهد؟

----------


## Himalaya

سلام



> چنانچه تاریخ میلادی در دیتا بیس ذخیره باشد و این کنترل از طریق پروپرتی  GregorianSelectedDate به ستون مربوطه در دیتابیس توسط  dataset بایند باشد  ، اگر تاریخ فارسی را تغییر دهیم آیا قابلیت این را دارد که تاریخ میلادی  را در فیلدی که به آن بایند شده نیز تغییر دهد ؟ یا صرفا تاریخ میلادی  بایند شده را بصورت فارسی آن نمایش می دهد؟


تا قبل از این اگه تاریخ فارسی تو دیتابیس (یا هر منبع داده ای) ذخیره میشد (با فرمت yyyy/mm/dd)، و به ستون از نوع DataGridViewFarsiDatePickerColumn، بایند میشد، این کنترل قادر بود تاریخ رو نمایش  بده و زمان ویرایش تاریخ تو سلول مورد نظر هم تقویم باز میشد و میتونستید تاریخ جدید رو انتخاب کنید. 
1. برای اینکه علاوه بر مورد بالا (تاریخ فارسی تو منبع داده)، تاریخ میلادی هم تو گرید، از طریق ستون DataGridViewFarsiDatePickerColumn قابل نمایش باشه، کلاس DataGridViewFarsiDatePickerColumn رو که به این پست پیوست کردم دانلود و تو پروژه جایگزین کنید و پروژه رو مجددا کامپایل و از dll جدید استفاده کنید
2. ببینید قرار نیست هیچ کنترلی بدون اطلاع برنامه نویس (کسی که از این کنترل استفاده میکنه، نه طراح اون) کاری رو انجام بده. تو این مورد هم همینطوره. شما تاریخ رو تو یکی از سلولهای گرید تغییر بدید، نباید اون تاریخ تو منبع داده تغییر کنه، مگه اینکه خود شما بخواید. واسه این کار هم از ایونتی که برای این نوع ستون در نظر گرفتم میتونید استفاده کنید (پست 20 گزینه 5)

----------


## shmasi

:گریه: سلام
میشه یکی به داد ما مبتدی ها هم برسه و از اول بگه که باید با این فولدر چه کنیم؟!
اولا که با 2010 باز نمیشه، با این مشکل چه کنم
بعد هم میخوام این تقویم با کلیک روی کمبوباکس باز شه و تاریخ رو انتخاب کنه
یه چیز مهم دیگه هم اینکه، من یه روز پیش فرض دارم مثلا دوشنبه، میخوام تاریخ اولین دوشنبه از تاریخ امروز رو در پیش فرض نشون بده

یه روزی همه مبتدی بودین،پس لطفا به ما مبتدی ها کمک کنید :گریه:

----------


## shmasi

هورااااااااااااااااااااا :لبخند گشاده!:  من با 2010 با یه راه حل زیبا و ساده بازش کردم ، اینجا میزارم برای دوستانی که 2010 دارن

1. فایل solution رو با Notepad یا wordpad باز کنید
2. در Header فایل، version رو به 11.00 و Visual Studio رو به 2010 تغییر بدید

----------


## shmasi

آقای امیر (Karaji333) میشه بگید چطور میشه قیافه این کمبو را به صورت عادی در آورد

----------


## mzzzzzzz

سلام.یه مشکل اساسی که تو همه تقویمای شمسی هست اونم مقدار null هستش.تو این کمپوننت به این زیبایی چرا حل نشده؟

----------


## Himalaya

سلام



> آقای امیر (Karaji333) میشه بگید چطور میشه قیافه این کمبو را به صورت عادی در آورد


متوجه نشدم.  این کامپوننت تو حالت DatePicker داره از کمبوباکس استفاده میکنه دیگه. قیافه عادی برای کمبو یعنی چی؟



> سلام.یه مشکل اساسی که تو همه تقویمای شمسی هست اونم مقدار null هستش.تو این کمپوننت به این زیبایی چرا حل نشده؟


در مورد حالت DatePicker و MonthCalendar تو پست 22 توضیح دادم. 
در مورد DataGridViewFarsiDatePickerColumn  هم کلاسی که تو پست 34 ضمیمه کردم رو تو پروژه جایگزین کنید تا مقدار null هم تو ستون در نظر گرفته بشه (چه تو حالت تاریخ شمسی (string) و چه تو حالت تاریخ میلادی (DateTime)). با این کار، سلولهایی از این ستون که با null ست شدن، تاریخی رو نمایش نمیدن

موفق باشید

----------


## mzzzzzzz

در مورد حالت DatePicker و MonthCalendar تو پست 22 توضیح دادم. 
در مورد DataGridViewFarsiDatePickerColumn هم کلاسی که تو پست 34 ضمیمه کردم رو تو پروژه جایگزین کنید تا مقدار null هم تو ستون در نظر گرفته بشه (چه تو حالت تاریخ شمسی (string) و چه تو حالت تاریخ میلادی (DateTime)). با این کار، سلولهایی از این ستون که با null ست شدن، تاریخی رو نمایش نمیدن

موفق باشید[/QUOTE]

میشه راهنماای کنید چجوری کلاس رو جایگزین کنم؟

----------


## sh

:متعجب: 



> میشه راهنماای کنید چجوری کلاس رو جایگزین کنم؟


این فایل رو کپی کن به جای فایل قبلی در پوشه پروژه

----------


## sh

سلام 
در کلاس زیر


 
DataGridViewFarsiDatePickerColumn


خط 230

برای چه منظوری این کد رو نوشتین :


 
.ToString(*CultureInfo.InvariantCulture*)

----------


## Himalaya

سلام



> برای چه منظوری این کد رو نوشتین : ...


مقدار  تاریخ رو (چه شمسی چه میلادی) تو پراپرتی EditingControlFormattedValue  باید به صورت رشته در نظر بگیریم و بعد تو قالب object برگردونیم.
اون CultureInfo.InvariantCulture باعث  میشه زمان تبدیل تاریخ میلادی به string، تنظیمات کامپیوتر تو قسمت  regional setting نادیده گرفته بشن و حالت پیشفرض اون که مثلا تاریخ رو با  جدا کننده / نمایش میده (نه - یا هر چیز دیگه)، در نظر گرفته بشه. (حالا  جدا کننده مربوط به اعداد و حالت AM,PM و ... به کنار) یه مورد استفادش  مثلا واسه زمانی هستش که میخواید بین 2 کامپیوتر اطلاعات رد و بدل کنید.  حالا اگه از CultureInfo.CurrentCulture استفاده کنید، تو یک کامپیوتر (که  بخش Date تو regional setting به صورت yyyy-MM-dd تنظیم شده) تاریخ به صورت  30-06-2013 میشه و تو اون یکی (با تنظیمات به صورت MM/dd/yyyy) تاریخ به  صورت 06/30/2013 نمایش داده میشه. این تفاوت ممکنه باعث بروز مشکلاتی بشه.  اما با CultureInfo.InvariantCulture تو هر دو، تاریخ به صورت 06/30/2013 نمایش داده میشه.
اما تو این کامپوننت ...
استفاده خاصی نداره. صرفا برای لبیک گفتن به پیشنهاد Resharper بوده. شما به جاش میتونید مثلا از کد زیر استفاده کنید
this.Value.GregorianSelectedDate.ToShortDateString  ()

موفق باشید

----------


## bazikadeh

واسه من نه کد نویسیش میاد نه فرمش نمیشه دللشو بزارین ؟

----------


## fa_karoon

لطفا من رو هم راهنمایی کنید(پیر شدم از بس تلاش کردم!)
من فایل AmirCalendar.dll  رو تو پوشه Bin پروژه ام قرار می دم بعد addRefrence می کنم این فایل رو بعد هم از ChooseItem فایل رو اضافه می کنم، اضافه می شه روی صفحه هم میاد حتی Using هم می کنم اما اجرا که می زنم این خطا رو می ده:
the type Or Namespace name 'AmirCalendar' could net be found(are you missing a using directive or an assembly reference?)
تو رو خدا کمک کنید خیلی ضروریه

----------


## Himalaya

سلام
فریمورک برنامت  احتمالا رو Client Profile 4 تنظیم شده. بزارش رو net framework 4

----------


## fa_karoon

مرسی از پاسختون درست شد، اما یه سوال: اگر این تغییر رو تو پروژه اصلیم بدم که مشکلی براش پیش نمیاد؟
و یه سوال دیگه: من یه گریدویو دارم می خوام یکی از سلول هاش این تقویم شمسی باشه، می شه راهنمایی کنید چه جوری می شه این کار رو انجام داد؟(اگر سوالم رو بد جا پرسیدم ببخشید تذکر بدید یه تاپیک جدی باز می کنم)
باز هم بی نهایت تشکر

----------


## Himalaya

سلام



> اگر این تغییر رو تو پروژه اصلیم بدم که مشکلی براش پیش نمیاد؟


نخیر مشکلی پیش نمیاد



> من یه گریدویو دارم می خوام یکی از سلول هاش این تقویم شمسی باشه، می شه راهنمایی کنید چه جوری می شه این کار رو انجام داد؟


تو پروژه TestControl که تو پست اول قرار دادم مثالش هست. با این حال
بعد از اعمال تغییراتی که تو پست 34 دربارش گفتم، فرض کنید منبع داده ما به این صورت باشه
var persons = new List<Person>
                              {
                                  new Person { BirthDate = "1364/01/01", Fullname = "AAAAA"},
                                  new Person { BirthDate = "1352/07/24", Fullname = "BBBBB"},
                                  new Person { BirthDate = "1354/11/23", Fullname = "CCCCC"},
                                  new Person { BirthDate = "1380/05/11", Fullname = "DDDDD"}
                              };
یا به این صورت
            var persons = new List<Person>
                              {
                                  new Person { BirthDate = new DateTime(1985,2,10), Fullname = "AAAAA"},
                                  new Person { BirthDate = new DateTime(1990,11,23), Fullname = "BBBBB"},
                                  new Person { BirthDate = new DateTime(1983,7,14), Fullname = "CCCCC"},
                                  new Person { BirthDate = new DateTime(1972,12,17), Fullname = "DDDDD"}
                              };
اگه از DataTable استفاده میکنید، BirthDate و Fullname میشن همون ستونهای DataTable.
کافیه به گرید 2 تا ستون اضافه کنید به صورت دستی. 
اولی از نوع DataGridViewTextBoxColumn که میخوایم ستون Fullname رو بهش بایند کنیم (پس DataPropertyName این ستون رو برابر Fullname قرار میدیم)
دومی از نوع DataGridViewFarsiDatePickerColumn که میخوایم ستون BirthDate رو بهش بایند کنیم (پس DataPropertyName این ستون رو برابر BirthDate قرار میدیم)

در نهایت هم 
gridPerson.AutoGenerateColumns = false;
            gridPerson.DataSource = persons;

اگه قراره ستون BirthDate قابل ویرایش باشه، خصوصیت ReadOnly این ستون رو برابر False بزارید

موفق باشید

----------


## civilan

سلام منم مشکل بالا رو دارم و نمیتونم و ویژوال استودیو 2010 ازش استفاده کنم اگر بشه لطفا ورژن 2010 رو هم قرار بدید

----------


## shmasi

> سلام منم مشکل بالا رو دارم و نمیتونم و ویژوال استودیو 2010 ازش استفاده کنم اگر بشه لطفا ورژن 2010 رو هم قرار بدید



1. فایل solution رو با Notepad یا wordpad باز کنید
2. در Header فایل، version رو به 11.00 و Visual Studio رو به 2010 تغییر بدید

----------


## shmasi

آقای امیر میشه بگید چطوری default selected value
رو برای هر روز تغییر بدیم و تاریخ هر روز در default بگیرد؟!
یکم عجله دارم،ممنون میشم جواب بدید

----------


## fool66

ای کاش شبیه این میشد با کیبورد تاریخ رو وارد کرد :افسرده: 
https://barnamenevis.org/showthread.p...85%D8%B3%DB%8C

اونم یه مشکل داره توی 2012 نمیشه اسفادش کرد

----------


## Himalaya

سلام




> چطوری default selected value
> رو برای هر روز تغییر بدیم و تاریخ هر روز در default بگیرد؟!


تو فرم لود
            datePicker1.Value.FarsiSelectedDate = FarsiDateHelper.GetShortFarsiDate(DateTime.Now);
            // or
            datePicker1.Value.GregorianSelectedDate = DateTime.Now;
واسه حالت دوم (ست کردن با تاریخ میلادی) بخش اول از پست 32 رو بخونید




> ای کاش شبیه این میشد با کیبورد تاریخ رو وارد کرد


تو پست 24 و 29 توضیح دادم در این مورد

----------


## asaghafi

سلام
يكي به من بيچاره بگه اگه بخوام تاريخ روز رو تو Value اين كامپوننت قرار بدم چي‌كار بايد بكنم. يعني هر روز كه فرم من باز ميشه تاريخ روز ديده بشه.
تو رو خدا  :گیج: 

شرمنده تو پست‌ها جوابشو پيدا كردم ممنون از همه.
 :خجالت:

----------


## leo_it

اگه قراره از تاریخ ویندوز استفاده کنی میتونی به میلادی اینجوری بنویسی :
PersianCalendar.Value.GregorianSelectedDate = DateTime.Now;


(درسته  تقریبا یک ماهی گذشته ولی گذاشتم واسه نفر بعدی :D)

----------


## ahmadiamin

سلام
خیلی ممنون بابت کامپوننت بسیار عالی که آماده کرده اید
فقط یه خواهش دارم...
من  در نرم افزارم از کامپوننتی استفاده می کنم که امکان خالی گذاشتن تاریخ  نیز وجود دارد، اما در این کامپوننت امکان خالی گذاشتن آن وجود ندارد و در  زمانی که value آن را پاک کنم یا null قرار می دهم بلافاصله تاریخ جاری  سیستم جایگزین می شود.
ممنون میشم راهنمایی کنید.

----------


## gprsm0

سلام
کار تون بسیار عالی و باقیات صالحاته
می خوام یک event calendar view در وبم ایجاد کنم و منتها تنها مشکلم اینه که نمی دونم که چطور به برنامه بگم که event ها رو از کجا بخونه 
می تونید راهنماییم کنید/.

----------


## davidrobert

سلام آقا *karaji333* بابت سورس تاریخ شمسی من از این کامپونت شما در برنامه استفاده کردم کامپونت خیلی خوب و کار راندازی هستش ولی یه مشکلی بر خورد کردم نمی تونم مقدار تاریخی که در تاریخ datetimepicker وجود دارد رو ذخیره کنم در دیتابیس من جدولم رو از نوع ساختم ولی برنامه به هیچ عنوان اطلاعات رو رو ذخیره نمی کنه من با تکنولوژی ای اف برنامه نویسی میکنم همه اطلاعات ذخیره میشه ولی اون نه جدول رو 2 بار از نوع باز سازی کردم ولی باز نمیشه اطلاعات رو ثبت کرد هنوز ممنون میشم بگشید ایراد برنامه چی هستش.
این سورس من هستش.
                    tblBusiness.B_Address = txtaddress.Text.Trim();
                    tblBusiness.B_Shobe = TxtBranch.Text.Trim();
                    tblBusiness.B_City = txtcity.Text.Trim();
               *     tblBusiness.B_DateTeses = cmbfarsiclander.Text;*
                    tblBusiness.B_DateOfRegistration = LblDate.Text.Trim();
                    tblBusiness.B_ShomareAgtesade = txtEconomicIssue.Text.Trim();
                    tblBusiness.B_NoyShogl = txtjob.Text.Trim();
                    tblBusiness.B_Last = txtlast.Text.Trim();
                    tblBusiness.B_Mobile = txtmobile.Text.Trim();
                    tblBusiness.B_Name = txtname.Text.Trim();
                    tblBusiness.B_Ostan = txtostan.Text.Trim();
                    tblBusiness.B_RegistrationTime = LblTime.Text.Trim();
                    tblBusiness.B_Sex = cmbsex.Text.Trim();
                    tblBusiness.B_Tel = txttel.Text.Trim();
                    tblBusiness.B_Semet = txtTheJob.Text.Trim();
                    tblBusiness.B_Town = txttown.Text.Trim();
                    tblBusiness.B_KhodShogl = txtYourJob.Text.Trim();
                    tblBusiness.B_Logo = picBytes;
                    db.AddToTbl_Business(tblBusiness);
                    db.SaveChanges();


اون کدی که با تمام کد ها فرق داره کد برای ذخیره در دیتابیس هستش

----------


## mostafa.parsaee

با درود به شما
ميشه لطفا بفرماييد چطوري مي تونم اين تقويم را بدون ديدن مناسبتهاي قمري ببينم؟يعني بايد چه تغغيراتي توش بدم تا اين كار انجام بشه؟من توي پروژم لازم دارم كه فقط تقويم فارسي باشه تا كاربر بتونه تاريخ را انتخاب كنه همين.و نيازي به مناسبت ها ندارم.
اگه خودتون هم داشتيد لطفا بذاريد ممنون ميشم

----------


## plus

> سلام ورژن این کد مشکل داره داخل 2010 باز نمیشه چه کارش کنم؟
> کد دیگه ای ندارین؟
> ممنون


اگه نمایش مناسبتهامهم نیست میتونید از کنترلی که لینکش تو امضام هست استفاده کنید.

----------


## kmohsenk

سلام خدمت همه دوستان.

اگه بخوام تاریخ رو مقایسه کنم بجز تبدیل به میلادی، راه حل دیگه ای داره که مقایسه انجام بشه که کدوم بزرگتره کدوم کوچیکتر؟

----------


## iranlondon

سلام
ممنون از کامپوننت خوبتون.
اگه من بخوام از کلاس های این کامپوننت استفاده کنم و فقط با دادن تاریخ true یا false بودن روز تعطیل رو برگردونه چکار باید بکنم.لطفا راهنمایی کنید
با تشکر

----------


## Dashti

دوست  عزيز    karaji333   ضمن  تشكر  از زحمتي  كه كشيديد . امكانش  هست كه  مثال از استفاده از اين ابزار  در vb.net  بذاري  . هر كدام از دوستان هم بتونه ممنون ميشم

----------


## masiha521

سلام و خسته نباشید خدمت دوستان
فایل  day events.xml را به پرژه اضافه کردم ولی تغییراتی که میدم تو برنامه اعمال نمیشه ممنون میشم راهنمایی کنید ،

----------


## sg.programmer

سلام 
چطور باید رویداد DoubleClick(object sender, EventArgs e)  دابل کلیک را فعال کنم؟

----------


## sg.programmer

سلام
چرا این NumericUpDown  وقتی ماوس روشون هست   3تا 3 تا اعمال میشه؟
میخوام یکی یکی تغییر کنه باید چیکار کنم؟

----------


## sg.programmer

> سلام
> چرا این NumericUpDown  وقتی ماوس روشون هست   3تا 3 تا اعمال میشه؟
> میخوام یکی یکی تغییر کنه باید چیکار کنم؟


سلام کسی از دوستان نمیدونه چطوره وقتی ماوس روی (ماه و سال) میره با چرخش  قلتک ماوس بجای 3 تا 3 تا عوض شدن ماه و سال (یکی یکی ) کم و زیاد بشه؟
incrementesh = 1  هست .

----------


## sg.programmer

با این روش درستش کردم - اینجا قرار میدم تا اگه کسی خواست استفاده کنه

protected override void OnMouseWheel(MouseEventArgs e)
    {
        HandledMouseEventArgs hme = e as HandledMouseEventArgs;
        if (hme != null)
            hme.Handled = true;

        if (e.Delta > 0)
            this.Value += this.Increment;
        else if (e.Delta < 0)
            this.Value -= this.Increment;
    }

----------


## jblaox

فایل پیوست شده کجاست؟؟

از کجا باید دانلود کنیم ؟؟

----------


## iran2008

سلام. فایل پیوست شده دیگه قابل نمایش نیست؟

----------

