PDA

View Full Version : خبر: دانلود کنید: کامپوننت DatePicker فارسی با قابلیت نمایش مناسبتهای تقویم شمسی و قمری (همراه با سورس)



Himalaya
سه شنبه 06 فروردین 1392, 16:23 عصر
سلام.
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
در مورد تقویم قمری هلالی و قراردادی هم این لینک (http://fa.wikipedia.org/wiki/%DA%AF%D8%A7%D9%87%E2%80%8C%D8%B4%D9%85%D8%A7%D8%B 1%DB%8C_%D9%87%D8%AC%D8%B1%DB%8C_%D9%82%D9%85%D8%B 1%DB%8C) رو مطالعه کنید بد نیست

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
چهارشنبه 07 فروردین 1392, 20:43 عصر
HijriCalendarPatch.xml استفاده کردم که مناسبتهای تقویم قمری رو برای سال شمسی مورد نظر ست میکنه. مشخصه که اگه سال دیگه ای جز سالی که HijriAdjustment برای اون ست شده، توسط DataPicker مشاهده بشه، مناسبتهای سال قمری یکی دو روز اینور اونور میشه نسبت به تقویم اصلی.
کا
سلام
با تشکر از شما
با توجه به نقل قول بالا بهتر نیست که از یک فایل برای سالهای متمادی استفاده بشه ؟ یعنی فایل xml بجز ماهها شامل سال ها هم باشه ؟

Himalaya
چهارشنبه 07 فروردین 1392, 21:20 عصر
سلام



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


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

aslan
چهارشنبه 07 فروردین 1392, 21:45 عصر
سلام



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

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

Himalaya
چهارشنبه 07 فروردین 1392, 22:24 عصر
دکمه تشکر جوایگوی زحمات شما نمی شه از شما بی نهایت تشکر میکنم
ممنون. لطف دارید


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

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

majidv
چهارشنبه 14 فروردین 1392, 23:59 عصر
مرسی.....فقط یه مشکلی داره.من فایلهای xml رو تغییر میدم ولی توی dll که تو برنامه استفاده می کنم تغییر نمی کنه. فقط توی Testcontrol تغییر می کنه..

vahidth
پنج شنبه 15 فروردین 1392, 00:19 صبح
داداش سوال من مبتدیه ولی چطوری اجراش کنم وقتی اجرا میکنم ارور میده

khoshkhu
پنج شنبه 15 فروردین 1392, 00:47 صبح
خیلی زحمت کشیدی
ممنون
من دو تا مشکل داخلش دیدم
1- وقتی فاکوس ازش گرفته میشه بسته نمیشه
2- اگه پایین فرم قرار داده بشه وقتی تقویم باز بشه روی فرم قرار نمی گیره
البته بچه ها زحمت میکشن درستش میکن
من هم سعی میکنم در اولین فرصت درستش کنم

mohammad2407
پنج شنبه 15 فروردین 1392, 19:16 عصر
سلام تقویم زیبا و پر کاربردی هست

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

Himalaya
پنج شنبه 15 فروردین 1392, 23:18 عصر
سلام


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

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


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

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

linux
پنج شنبه 15 فروردین 1392, 23:58 عصر
دیدم که از دیتاگرید استفاده کردید. این کار زیاد جالب نیست.

Himalaya
جمعه 16 فروردین 1392, 02:26 صبح
سلام


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

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

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

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

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

موفق باشید

khoshkhu
جمعه 16 فروردین 1392, 10:55 صبح
باز هم ازت تشکر میکنم
ولی اگه popup مثل popup کامپونت DateTimePicker خود سی شارپ باز بشه بهتره

Himalaya
یک شنبه 18 فروردین 1392, 15:33 عصر
سلام

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

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

102474

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 قابل انجامه

102480http://barnamenevis.org/images/misc/pencil.png

morteza.azad
دوشنبه 19 فروردین 1392, 14:56 عصر
با سلام و تشکر فراوان از کامپوننت کاربردیتون
ی سوال داشتم. میخواستم بدونم چطور میشه روزهای تعظیل رو تشخیص داد، آیا پروپرتی ای واسه این درنظر گرفته شده یا نه؟ من خیلی به این مسئله نیازمندم.
با تشکر از شما

Himalaya
چهارشنبه 21 فروردین 1392, 13:38 عصر
سلام

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

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

102588

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

102589

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
پنج شنبه 02 خرداد 1392, 08:14 صبح
یه سوال داشتم اونم اینه که من میخوام مقدار تقویم جای خالی باشه .این تقویم همچنین قابلیتو داره؟

Himalaya
پنج شنبه 02 خرداد 1392, 17:37 عصر
سلام


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

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

موفق باشید

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

Himalaya
جمعه 03 خرداد 1392, 20:13 عصر
سلام

ممنون بابت کامپوننت بسیار زیبایی که ایجاد کردید
همه نکات را رعایت کردید اما اگر 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
جمعه 03 خرداد 1392, 22:33 عصر
خیلی قشنگه و باید بگم من هم همون مشکلی رو دارم که لینوکس داره.
دیتا گرید اصلا جالب نیست.چون توی لینوکس نوشته هاش خراب میشه.البته یک سالی میشه که تست نکردم ولی باید هنوز هم همین مشکل رو داشته باشه.
متاسفانه الان فرصت تست ندارم ولی اگر گرید رو درست کنم براتون نسخه اصلاح شده رو میفرستم.

Himalaya
جمعه 03 خرداد 1392, 23:35 عصر
سلام.


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

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

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

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

sarbandi
شنبه 04 خرداد 1392, 23:32 عصر
سلام

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

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

مجددا گفتن


و جواب:
واسه کار با کیبورد
فایل 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 طبق گفته قبلی، بخشهای تاریخ رو میتونید کم و زیاد بکنید


موفق باشید

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

104668

Himalaya
یک شنبه 05 خرداد 1392, 01:57 صبح
سلام


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

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


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

و

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



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

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

موفق باشید

jadidian
سه شنبه 21 خرداد 1392, 11:17 صبح
چه جوري تاريخ ذخيره شده را در تقويم نمايش بدهيم مثلا ميخوام تقويم 1392/03/05 را نشون بده ؟

sh
شنبه 01 تیر 1392, 00:38 صبح
سلام دوست عزیز

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


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

Himalaya
شنبه 01 تیر 1392, 01:48 صبح
سلام


چه جوري تاريخ ذخيره شده را در تقويم نمايش بدهيم مثلا ميخوام تقويم 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
شنبه 01 تیر 1392, 12:28 عصر
دوست عزیز در ادامه توضیحات بالا عملکرد این کنترل در خصوص موارد زیر به چه صورت است.
چنانچه تاریخ میلادی در دیتا بیس ذخیره باشد و این کنترل از طریق پروپرتی GregorianSelectedDate به ستون مربوطه در دیتابیس توسط dataset بایند باشد ، اگر تاریخ فارسی را تغییر دهیم آیا قابلیت این را دارد که تاریخ میلادی را در فیلدی که به آن بایند شده نیز تغییر دهد ؟ یا صرفا تاریخ میلادی بایند شده را بصورت فارسی آن نمایش می دهد؟

Himalaya
شنبه 01 تیر 1392, 21:16 عصر
سلام

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

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

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

shmasi
دوشنبه 03 تیر 1392, 18:02 عصر
هورااااااااااااااااااااا: بخند: من با 2010 با یه راه حل زیبا و ساده بازش کردم ، اینجا میزارم برای دوستانی که 2010 دارن

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

shmasi
دوشنبه 03 تیر 1392, 18:17 عصر
آقای امیر (Karaji333) میشه بگید چطور میشه قیافه این کمبو را به صورت عادی در آورد

mzzzzzzz
سه شنبه 04 تیر 1392, 00:07 صبح
سلام.یه مشکل اساسی که تو همه تقویمای شمسی هست اونم مقدار null هستش.تو این کمپوننت به این زیبایی چرا حل نشده؟

Himalaya
سه شنبه 04 تیر 1392, 02:15 صبح
سلام


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

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


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

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

موفق باشید

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

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

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

sh
جمعه 07 تیر 1392, 14:36 عصر
:متعجب:



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


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

sh
جمعه 07 تیر 1392, 21:29 عصر
سلام
در کلاس زیر




DataGridViewFarsiDatePickerColumn


خط 230

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




.ToString(CultureInfo.InvariantCulture)

Himalaya
یک شنبه 09 تیر 1392, 13:39 عصر
سلام

برای چه منظوری این کد رو نوشتین : ...مقدار تاریخ رو (چه شمسی چه میلادی) تو پراپرتی 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
یک شنبه 16 تیر 1392, 17:54 عصر
واسه من نه کد نویسیش میاد نه فرمش نمیشه دللشو بزارین ؟

fa_karoon
جمعه 21 تیر 1392, 14:35 عصر
لطفا من رو هم راهنمایی کنید(پیر شدم از بس تلاش کردم!)
من فایل 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
جمعه 21 تیر 1392, 19:47 عصر
سلام
فریمورک برنامت احتمالا رو Client Profile 4 تنظیم شده. بزارش رو net framework 4

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

Himalaya
شنبه 22 تیر 1392, 01:22 صبح
سلام

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

من یه گریدویو دارم می خوام یکی از سلول هاش این تقویم شمسی باشه، می شه راهنمایی کنید چه جوری می شه این کار رو انجام داد؟تو پروژه 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
دوشنبه 24 تیر 1392, 17:40 عصر
سلام منم مشکل بالا رو دارم و نمیتونم و ویژوال استودیو 2010 ازش استفاده کنم اگر بشه لطفا ورژن 2010 رو هم قرار بدید

shmasi
جمعه 28 تیر 1392, 12:18 عصر
سلام منم مشکل بالا رو دارم و نمیتونم و ویژوال استودیو 2010 ازش استفاده کنم اگر بشه لطفا ورژن 2010 رو هم قرار بدید


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

shmasi
جمعه 28 تیر 1392, 12:22 عصر
آقای امیر میشه بگید چطوری default selected value
رو برای هر روز تغییر بدیم و تاریخ هر روز در default بگیرد؟!
یکم عجله دارم،ممنون میشم جواب بدید

fool66
جمعه 28 تیر 1392, 14:29 عصر
ای کاش شبیه این میشد با کیبورد تاریخ رو وارد کرد:افسرده:
http://barnamenevis.org/showthread.php?365257-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D8%B4%D9%85%D8%B3%DB%8C&highlight=%D8%AA%D9%82%D9%88%DB%8C%D9%85+%D8%B4%D9 %85%D8%B3%DB%8C

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

Himalaya
جمعه 28 تیر 1392, 17:28 عصر
سلام


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

تو فرم لود

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


ای کاش شبیه این میشد با کیبورد تاریخ رو وارد کرد
تو پست 24 و 29 توضیح دادم در این مورد

asaghafi
سه شنبه 26 آذر 1392, 13:29 عصر
سلام
يكي به من بيچاره بگه اگه بخوام تاريخ روز رو تو Value اين كامپوننت قرار بدم چي‌كار بايد بكنم. يعني هر روز كه فرم من باز ميشه تاريخ روز ديده بشه.
تو رو خدا :گیج:

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

leo_it
چهارشنبه 18 دی 1392, 20:16 عصر
اگه قراره از تاریخ ویندوز استفاده کنی میتونی به میلادی اینجوری بنویسی :

PersianCalendar.Value.GregorianSelectedDate = DateTime.Now;


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

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

gprsm0
پنج شنبه 05 تیر 1393, 12:50 عصر
سلام
کار تون بسیار عالی و باقیات صالحاته
می خوام یک event calendar view در وبم ایجاد کنم و منتها تنها مشکلم اینه که نمی دونم که چطور به برنامه بگم که event ها رو از کجا بخونه
می تونید راهنماییم کنید/.

davidrobert
پنج شنبه 23 مرداد 1393, 15:46 عصر
سلام آقا karaji333 (http://barnamenevis.org/member.php?53563-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
شنبه 15 شهریور 1393, 14:18 عصر
با درود به شما
ميشه لطفا بفرماييد چطوري مي تونم اين تقويم را بدون ديدن مناسبتهاي قمري ببينم؟يعني بايد چه تغغيراتي توش بدم تا اين كار انجام بشه؟من توي پروژم لازم دارم كه فقط تقويم فارسي باشه تا كاربر بتونه تاريخ را انتخاب كنه همين.و نيازي به مناسبت ها ندارم.
اگه خودتون هم داشتيد لطفا بذاريد ممنون ميشم

plus
چهارشنبه 27 اسفند 1393, 20:01 عصر
سلام ورژن این کد مشکل داره داخل 2010 باز نمیشه چه کارش کنم؟:ناراحت:
کد دیگه ای ندارین؟
ممنون

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

kmohsenk
پنج شنبه 26 فروردین 1395, 09:21 صبح
سلام خدمت همه دوستان.

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

iranlondon
یک شنبه 26 اردیبهشت 1395, 00:38 صبح
سلام
ممنون از کامپوننت خوبتون.
اگه من بخوام از کلاس های این کامپوننت استفاده کنم و فقط با دادن تاریخ true یا false بودن روز تعطیل رو برگردونه چکار باید بکنم.لطفا راهنمایی کنید
با تشکر

Dashti
چهارشنبه 16 تیر 1395, 20:03 عصر
دوست عزيز karaji333 ضمن تشكر از زحمتي كه كشيديد . امكانش هست كه مثال از استفاده از اين ابزار در vb.net بذاري . هر كدام از دوستان هم بتونه ممنون ميشم

masiha521
یک شنبه 15 اسفند 1395, 08:30 صبح
سلام و خسته نباشید خدمت دوستان
فایل day events.xml را به پرژه اضافه کردم ولی تغییراتی که میدم تو برنامه اعمال نمیشه ممنون میشم راهنمایی کنید ،

sg.programmer
یک شنبه 19 آذر 1396, 23:10 عصر
سلام
چطور باید رویداد DoubleClick(object sender, EventArgs e) دابل کلیک را فعال کنم؟

sg.programmer
چهارشنبه 22 آذر 1396, 16:06 عصر
سلام
چرا این NumericUpDown وقتی ماوس روشون هست 3تا 3 تا اعمال میشه؟
میخوام یکی یکی تغییر کنه باید چیکار کنم؟

sg.programmer
جمعه 24 آذر 1396, 17:26 عصر
سلام
چرا این NumericUpDown وقتی ماوس روشون هست 3تا 3 تا اعمال میشه؟
میخوام یکی یکی تغییر کنه باید چیکار کنم؟

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

sg.programmer
شنبه 25 آذر 1396, 19:50 عصر
با این روش درستش کردم - اینجا قرار میدم تا اگه کسی خواست استفاده کنه

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
چهارشنبه 28 آبان 1399, 12:43 عصر
فایل پیوست شده کجاست؟؟

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

iran2008
دوشنبه 17 مرداد 1401, 22:00 عصر
سلام. فایل پیوست شده دیگه قابل نمایش نیست؟