PDA

View Full Version : سوال: تغییر Application.CurrentCulture.Calendar



arefsoft
سه شنبه 14 خرداد 1387, 14:49 عصر
آیا امکان ست کردن کلاس PersianCalendar به خصوصیت Application.CurrentCulture.Calendar وجود دارد.

این خصوصیت در یک برنامه ویندوزی در .NET وجود دارد

در منطق این عمل امکان پذیر است زیرا کلاس PersianCalendar از نوع Calendar است.

دوستان راهنمایی کنند آیا با توابع API امکان پذیر است یا نه

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

rostamkhani
چهارشنبه 15 خرداد 1387, 00:16 صبح
سوال رو متوجه نشدم سوال رو واضح بیان کنید یا دقیقا کاری که میخواهین انجام بدین رو توضیح بدین

arefsoft
چهارشنبه 15 خرداد 1387, 13:21 عصر
سوال رو متوجه نشدم سوال رو واضح بیان کنید یا دقیقا کاری که میخواهین انجام بدین رو توضیح بدین


حالا دوباره بخوانید.

مهدی کرامتی
چهارشنبه 15 خرداد 1387, 16:05 عصر
اون کار رو مستقیما نمی تونید انجام بدید، چون PersianCalendar جزو لیست تقویم های مجاز دات نت نیست. اما با استفاده از متد ActivatePersianCalendar در کلاس زیر می توانید تقویم شمسی را به تنظیمات Localization تزریق کنید. نتیجه همان چیزی خواهد بود که شما انتظار دارید.


using System;
using System.Collections.Generic;
using System.Text;

namespace PersianUtils
{
public class CalendarUtils
{
public static void ActivatePersianCalendar()
{
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "dd/MM/yyyy";
info.LongDatePattern = "dd/MM/yyyy";


info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
}
}
}

ali_kolahdoozan
چهارشنبه 15 خرداد 1387, 16:33 عصر
جالب بود . اما كاش ميشد ابزارهاي كار با تاريخ خود دات نت رو عوضشون كرد . با اين سورس دوست سوال كننده به هدفش نخواهد رسيد . فقط رفتار سيستم نسبت به تاريخ شمسي شد . اما باز هم كنترلها به شمسي كاري ندارن
در ضمن datepicker خود دات نت همچين چيز جالبي نيست خودتان ميتوانيد يكي خيلي بهتر بنويسيد

ali_kolahdoozan
چهارشنبه 15 خرداد 1387, 19:26 عصر
كرامتي جان يك عيب اين كد داره . وقتي بخشي از تاريخ رو بخواهيم باز ميلادي ميده مثلا datetime.now.year اينجاست كه باز ميدهد 2008 . ببين حل ميشه . خيلي مرسي

مهدی کرامتی
چهارشنبه 15 خرداد 1387, 20:25 عصر
این کد رو باید هر دفعه تو Form_Load فراخوانی کنی. اونوقت درست میشه.

همچنین یکی از کاربران این سایت بنام هادی اسکندری مجموعه ای برای کنترل های تاریخ شمسی در Code Project منتشر کرده بود و اینجا لینکش رو گذاشته بود. میتونید برای انتخابگر تاریخ از اون استفاده کنید که خیلی هم کامله.

ali_kolahdoozan
چهارشنبه 15 خرداد 1387, 22:08 عصر
من فقط از سر كنج كاوي خواستم . مگر نه براي كار با تاريخ ابزارهام كامله ممنون. در مورد سورس با وجود توي متد سازنده فرم بودن باز هم وضع همينه كه گفتم

علیرضا مداح
پنج شنبه 16 خرداد 1387, 10:06 صبح
سلام دوست عزیز ،


همچنین یکی از کاربران این سایت بنام هادی اسکندری مجموعه ای برای کنترل های تاریخ شمسی در Code Project منتشر کرده بود و اینجا لینکش رو گذاشته بود. میتونید برای انتخابگر تاریخ از اون استفاده کنید که خیلی هم کامله.
http://www.codeproject.com/KB/selection/FarsiLibrary.aspx

mohammed
دوشنبه 21 مرداد 1387, 11:23 صبح
این کد رو باید هر دفعه تو Form_Load فراخوانی کنی. اونوقت درست میشه.




سلام آقای کرامتی

این کد را form_load گذاشتم اما نفهمیدم چه چیز درست می شود. منظورم این است که دقیقا نمی دانم با این تزریق تقویم چه چیزی بدست می آید. ممکن است توضیح دهید؟ (چون من در زمینه کار با ابزار های تاریخ سابقه کمی دارم و ابزاریهای .net را کامل نمی شناسم.)

با تشکر
محمد حامد

nima_dir
سه شنبه 16 مهر 1387, 16:34 عصر
سلام
در ASP.NET با override کردن متد رندر میشه کنترل Calendar رو شمسی کرد آیا راهی وجو داره که DatetimePicker رو هم اینجوری شمسی کرد
با تشکر