PDA

View Full Version : تقویم شمسی (Persian Calendar) در ویژوال استودیو 2010 (vs 2010 = visual studio 2010)



majid_darab
سه شنبه 16 فروردین 1390, 19:55 عصر
(ویرایش شده پس از پاسخ ها)
با سلام :
مدتی بود که تو سایت برنامه نویس نبودم و به تمامی دوستان سال جدید رو تبریک می گم...

در حال حاضر آیا این امکان وجود دارد که در vs 2010 (دات نت فریم ورک 4) بدون استفاده از هیچ کلاس یا dll جانبی خاصی تاریخ شمسی را با امکانات خود .net 4 داشته باشیم؟
چنانچه تنظیم یا روش خاصی (مثلا تغییر در properties خود پروژه) برای تاریخ شمسی وجود ندارد بهترین کلاس نوشته شده برای تقویم شمسی چیست؟(سوال 1)

در مورد شمسی بودن 3 فاکتور وجود دارد :
الف)کامپوننت تقویم
ب)تاریخی که در یک لیبل نمایش داده می شه
ج)فارسی کردن اعداد بکار رفته در لیبل و کامپوننت تقویم

برای فارسی کردن اعداد بکار رفته در لیبل می توان رشته تاریخ لیبل را توسط متد خاصی گرفت و اعداد درون آن را فارسی کرد!
به نظرم این کار زیاد جالب نیست.چون با تغییر ماهیت اعداد ما در حقیقت دیگر با عدد سروکارنداریم و امکان انجام محاسبات ریاضی
روی این اعداد وجود ندارد.
چگونه می توان این کار را با پروپرتی ها و متد های کلاس های PersianCalendar و CultureInfo و DateTimeFormatInfo انجام داد؟
(سوال 2)
در مورد کامپوننت تقویم چطور ؟ اول اینکه چطور شمسیش کنیم و دوم اینکه چطور اعداد داخل اونو مثل بالا به فرمت فارسی تبدیل کنیم.؟
(سوال 3)


با تشکر
مجید داراب
همیشه شاد و سلامت باشید

majid_darab
سه شنبه 16 فروردین 1390, 20:39 عصر
من کلاس زیرو که توسط دوست خوبمون آقای محمد میرمصطفی در codeproject قرار داده شده بود پیدا کردم ...
http://www.codeproject.com/KB/cs/PersianDateTime.aspx
اما هنوز بررسیش نکردم و نمی دونم داره از امکانات vs 2010 استفاده می کنه و یا اینکه این کلاسو در گذشته در این قسمت قرار داده بود.

مهدی کرامتی
پنج شنبه 18 فروردین 1390, 12:10 عصر
بهترین گزینه برای استفاده از تاریخ شمسی در برنامه ها استفاده از کلاس PersianCalendar خود دات نت است. تنها مشکلی که وجود دارد عدم امکان استفاده از آن به عنوان تقویم پیش فرض برنامه است که نصب این افزونه: http://persianculture.codeplex.com
محدودیت فوق برطرف می شود.

raziee
پنج شنبه 18 فروردین 1390, 19:53 عصر
بهترین گزینه برای استفاده از تاریخ شمسی در برنامه ها استفاده از کلاس PersianCalendar خود دات نت است. تنها مشکلی که وجود دارد عدم امکان استفاده از آن به عنوان تقویم پیش فرض برنامه است که نصب این افزونه: http://persianculture.codeplex.com
محدودیت فوق برطرف می شود.

جناب کرامتی برای نمایش اعداد فارسی چه بلایی باید سر کد هابیاریم؟
آیا استفاده از اعداد فارسی امکان پذیر هست یا خیر؟

info.NativeDigits = new string[] { "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" };
کد بالا هیچ تاثیری ندارد.!!!
CultureInfo currentCI = Thread.CurrentThread.CurrentCulture;
NumberFormatInfo nfi = currentCI.NumberFormat;
string[] nativeDigitList = nfi.NativeDigits;


foreach (string s in nativeDigitList)
{
Response.Write(s + "<br/>");
}
اعداد درست Set میشند اما در اجرا هیچ تاثیری نداره.

کسی دلیلش رو میدونه؟

majid_darab
جمعه 19 فروردین 1390, 03:18 صبح
جناب کرامتی برای نمایش اعداد فارسی چه بلایی باید سر کد هابیاریم؟
آیا استفاده از اعداد فارسی امکان پذیر هست یا خیر؟

info.NativeDigits = new string[] { "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" };
کد بالا هیچ تاثیری ندارد.!!!
CultureInfo currentCI = Thread.CurrentThread.CurrentCulture;
NumberFormatInfo nfi = currentCI.NumberFormat;
string[] nativeDigitList = nfi.NativeDigits;


foreach (string s in nativeDigitList)
{
Response.Write(s + "<br/>");
}
اعداد درست Set میشند اما در اجرا هیچ تاثیری نداره.

کسی دلیلش رو میدونه؟



با سلام و عرض خسته نباشید :
من امروز کلی با کلاس های CultureInfo و PersianCalendar و DateTimeFormatInfo سروکله زدم.
استنباط من اینه که culture پیش فرض vs به صورت fa-IR می باشد(به خاطر وجود زبان فارسی نصب شده در ویندوز)
خوب پس culture پیش فرض شد fa-IR که داره از GregorianCalendar به صورت پیش فرض استفاده می کنه.
کامپوننت تقویم هم داره براساس culture و تقویم پیش فرض عمل می کنه
اگر در پروژه ی خود کد زیرور دی باگ کنید می بینید که بیشتر تنظیمات مورد نیاز ما در Culture فارسی وجود دارد !
CultureInfo facultureinfo = new CultureInfo("fa-IR");
از جمله اعدادی که ما به دنبال تبدیل اونها به فارسی هستیم (در قسمت NumberDigits) به صورت فارسی تنظیم شده اند.
اما نمی دونم چرا همواره اعداد به صورت انگلیسی در خروجی نشان داده می شوند؟
مورد بعدی اینه که وفتی کامپوننت تقویمو استفاده می کنیم به خاطر کالچر پیش فرض فارسی روزهای هفته را به جای انگلیسی با فارسی نشان می دهد (حرف اول روز) و یه جواریی شده تلفیقی از فرهنگ فارسی و تقویم انگلیسی
برای درست شدن این قضیه باید culture را به en-US تغییر داد تا فرهنگ و تقویم همسان شوند.

منتظر راهنمایی مدیران محترم هستیم...

با تشکر از توجه شما

majid_darab
یک شنبه 21 فروردین 1390, 14:41 عصر
با سلام :
من افزونه ای که مدیر محترم کرامتی اعلام فرمودند را نصب کردم.
ولی یه ریزه گیج شدم.
زمانی که این افزونه نصب است چه اتفاقی در دات نت فریم ورک 4 (VS 2010) می افتد ؟
بدون نصب افزونه از چه کدهایی باید در PAGE_LOAD استفاده نماییم و با افزونه چطور؟

در لینک مورد نظر یه CONSOLE APP داشتیم که با دات نت فریم ورک 2 و 3.5 به خوبی در VS 2010 کار می کنه ، اما وفتی .NET FRAMEWORK رو به 4 تغییر می دیم در یک سری از خطوط ارور می دهد.(ارورها درکلاس PersianCultureHelper)
کد مورد نظر در پروژه پس از اعمال تغییرات در نام گذاری ها به صورت زیر شد :

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Globalization;

namespace PersianCulture
{

public static class PersianCultureHelper
{
//Represents a PropertyInfo that refer to ID of Calendar. The ID is private property of Calendar.
private static PropertyInfo calendarID;

//Represents a FieldInfo that refer to m_isReadOnly of CultureInfo. The m_isReadOnly is private filed of CultureInfo.
private static FieldInfo cultureInfoReadOnly;

//Represents a FieldInfo that refer to calendar of CultureInfo. The calendar is private filed of CultureInfo.
private static FieldInfo cultureInfoCalendar;

//Represents a FieldInfo that refer to isReadOnly of NumberFormatInfo. The isReadOnly is private filed of NumberFormatInfo.
private static FieldInfo numberFormatInfoReadOnly;

//Represents a FieldInfo that refer to m_isReadOnly of DateTimeFormatInfo. The m_isReadOnly is private filed of DateTimeFormatInfo.
private static FieldInfo dateTimeFormatInfoReadOnly;

//Represents a FieldInfo that refer to calendar of DateTimeFormatInfo. The calendar is private filed of DateTimeFormatInfo.
private static FieldInfo dateTimeFormatInfoCalendar;

//Represents a FieldInfo that refer to m_cultureTableRecord of DateTimeFormatInfo. The m_cultureTableRecord is private filed of DateTimeFormatInfo.
//private static FieldInfo dateTimeFormatInfoCultureTableRecord;

//Represents a MethodInfo that refer to UseCurrentCalendar of CultureTableRecord. The UseCurrentCalendar is private method of CultureTableRecord that the class is private too.
//private static MethodInfo cultureTableRecordUseCurrentCalendar;

/// <summary>
/// Represents static constructor
/// </summary>
static PersianCultureHelper()
{
calendarID = typeof(Calendar).GetProperty("ID", BindingFlags.NonPublic | BindingFlags.Instance);
cultureInfoReadOnly = typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
cultureInfoCalendar = typeof(CultureInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
numberFormatInfoReadOnly = typeof(NumberFormatInfo).GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
dateTimeFormatInfoCalendar = typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
dateTimeFormatInfoReadOnly = typeof(DateTimeFormatInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
//dateTimeFormatInfoCultureTableRecord = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
//Type cultureTableRecord = typeof(DateTimeFormatInfo).Assembly.GetType("System.Globalization.CultureTableRecord");
//cultureTableRecordUseCurrentCalendar = cultureTableRecord.GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);
}

/// <summary>
/// Represents a method that set PersianCalendar to specified instances of CultureInfo
/// </summary>
/// <param name="culture">Represents an instance of CultureInfo that persian number format should be set to it.</param>
public static void SetPersianOptions(CultureInfo farsicultureinfo)
{
SetPersianCalendar(farsicultureinfo, new DateTimeFormatInfo());
}

/// <summary>
/// Represents a method that set PersianCalendar to specified instances of CultureInfo and DateTimeFormatInfo
/// </summary>
/// <param name="culture">Represents an instance of CultureInfo that persian number format should be set to it.</param>
/// <param name="dateTimeFormat">Represents an instance of DateTimeFormatInfo that persian format should be set to it.</param>
public static void SetPersianCalendar(CultureInfo farsicultureinfo, DateTimeFormatInfo datetimeformatinfo)
{
if (farsicultureinfo == null || farsicultureinfo.LCID != 1065)
return;
PersianCalendar persiacalendar = new PersianCalendar();
bool readOnly = (bool)cultureInfoReadOnly.GetValue(farsicultureinf o);
if (readOnly)
{
cultureInfoReadOnly.SetValue(farsicultureinfo, false);
}
farsicultureinfo.DateTimeFormat = datetimeformatinfo;
InitPersianDateTimeFormat(datetimeformatinfo);
cultureInfoCalendar.SetValue(farsicultureinfo, persiacalendar);
InitPersianNumberFormat(farsicultureinfo);
if (readOnly)
{
cultureInfoReadOnly.SetValue(farsicultureinfo, true);
}
}

/// <summary>
/// Represents a method that set persian number format to specified instance CultureInfo.
/// </summary>
/// <param name="info">Represents an instance of CultureInfo that persian number format should be set to it.</param>
public static void InitPersianNumberFormat(CultureInfo farsicultureinfo)
{
InitPersianNumberFormat(farsicultureinfo.NumberFor mat);
}

/// <summary>
/// Represents a method that set persian number format to specified instance NumberFormatInfo.
/// </summary>
/// <param name="info">Represents an instance of NumberFormatInfo that persian option should be set to it.</param>
public static void InitPersianNumberFormat(NumberFormatInfo farsicultureinfoNumberFormatInfo)
{
if (farsicultureinfoNumberFormatInfo == null)
return;
bool readOnly = (bool)numberFormatInfoReadOnly.GetValue(farsicultu reinfoNumberFormatInfo);
if (readOnly)
{
numberFormatInfoReadOnly.SetValue(farsicultureinfo NumberFormatInfo, false);
}
farsicultureinfoNumberFormatInfo.NativeDigits = new string[] { "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" };
farsicultureinfoNumberFormatInfo.CurrencyDecimalSe parator = "/";
farsicultureinfoNumberFormatInfo.CurrencySymbol = "ريال";
if (readOnly)
{
numberFormatInfoReadOnly.SetValue(farsicultureinfo NumberFormatInfo, true);
}
}

/// <summary>
/// Represents a method that set persian option to specified instance CultureInfo
/// </summary>
/// <param name="dateTimeFormat">Represents an instance of DateTimeFormatInfo that persian option should be set to it.</param>
public static void InitPersianDateTimeFormat(DateTimeFormatInfo datetimeformatinfo)
{
if (datetimeformatinfo == null)
return;
PersianCalendar persiacalendar = new PersianCalendar();
bool readOnly = (bool)dateTimeFormatInfoReadOnly.GetValue(datetime formatinfo);
if (readOnly)
{
dateTimeFormatInfoReadOnly.SetValue(datetimeformat info, false);
}
dateTimeFormatInfoCalendar.SetValue(datetimeformat info, persiacalendar);
//object obj2 = dateTimeFormatInfoCultureTableRecord.GetValue(info );
//cultureTableRecordUseCurrentCalendar.Invoke(obj2, new object[] { calendarID.GetValue(calendar, null) });
datetimeformatinfo.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
datetimeformatinfo.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
datetimeformatinfo.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
datetimeformatinfo.AbbreviatedMonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
datetimeformatinfo.MonthNames = new string[] { "فروردین", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
datetimeformatinfo.AMDesignator = "ق.ظ";
datetimeformatinfo.PMDesignator = "ب.ظ";
datetimeformatinfo.FirstDayOfWeek = DayOfWeek.Saturday;
datetimeformatinfo.FullDateTimePattern = "yyyy, MMMM dddd, dd HH:mm:ss";
datetimeformatinfo.LongDatePattern = "yyyy , MMMM dddd , dd";//Change This Line Causes Problems
datetimeformatinfo.ShortDatePattern = "yyyy/MM/dd";
if (readOnly)
{
dateTimeFormatInfoReadOnly.SetValue(datetimeformat info, true);
}
}
}
}


واما خطوط دارای ارور :
//cultureTableRecordUseCurrentCalendar = cultureTableRecord.GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);

---------------------------------------

//object obj2 = dateTimeFormatInfoCultureTableRecord.GetValue(info );
//cultureTableRecordUseCurrentCalendar.Invoke(obj2, new object[] { calendarID.GetValue(calendar, null) });


چگونه این ارورها را رفع نمایم؟
فکر می کنم این کدها در ارتباط با اسمبلی دات نت هستند که برای تحقیق درمورد آنها باید Reflector را در دات نت بررسی کرد.

واما کدی که در page_Load استفاده می کنم به صورت زیر است :
CultureInfo facultureinfo = new CultureInfo("fa-IR");
PersianCultureHelper.SetPersianOptions(faculturein fo);
Thread.CurrentThread.CurrentCulture = facultureinfo;

واین در حالتی ست که افزونه نصب است.

اگر راهنمایی بفرمایید ممنون می شوم

باتشکر
مجید داراب

monika
سه شنبه 16 اسفند 1390, 11:18 صبح
سلام من میخوام داخل پروژه ام ویزیت آنلاین داشته باشم این کاربه تعریف تاریخ شمسی احتیاج داره؟
من چطور باید این کاررو انجام بدم .طوری که تاریخ وساعت توپروژه ام تعریف بشه

HOSSEINGHOLI
شنبه 31 تیر 1391, 16:05 عصر
من persian culture رو نصب کردم چیکار کنم که تقویم در فرم شمسی بشه

sanay_esh
شنبه 31 تیر 1391, 16:41 عصر
با سلام خدمت همه اساتید محترم ( بخصوص استاد گرانقدر جناب کرامتی ) و دوستان عزیز

برای استفاده از تقویم شمسی باید مراحل زیر را طی نمود:

ابتدا یک کلاس با محتویات زیر به پروژه خود اضافه نمائید:
public class PersianCulture : CultureInfo
{
private readonly Calendar cal;
private readonly Calendar[] optionals;


public PersianCulture()
: this("fa-IR", true)
{
}

public PersianCulture(string cultureName, bool useUserOverride)
: base(cultureName, useUserOverride)
{
//Temporary Value for cal.
cal = base.OptionalCalendars[0];

//populating new list of optional calendars.
var optionalCalendars = new List<Calendar>();
optionalCalendars.AddRange(base.OptionalCalendars) ;
optionalCalendars.Insert(0, new PersianCalendar());


Type formatType = typeof(DateTimeFormatInfo);
Type calendarType = typeof(Calendar);


PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars",
BindingFlags.Instance | BindingFlags.NonPublic);

//populating new list of optional calendar ids
var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);

optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);

optionals = optionalCalendars.ToArray();
cal = optionals[0];
DateTimeFormat.Calendar = optionals[0];

DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };


DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

DateTimeFormat.AMDesignator = "ق.ظ";
DateTimeFormat.PMDesignator = "ب.ظ";

/*
DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
DateTimeFormat.LongDatePattern = "yyyy/MM/dd";

DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy/MM/dd"}, 'd');
DateTimeFormat.SetAllDateTimePatterns(new[] {"dddd, dd MMMM yyyy"}, 'D');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'y');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'Y');
*/

}

public override Calendar Calendar
{
get { return cal; }
}

public override Calendar[] OptionalCalendars
{
get { return optionals; }
}

سپس با راست کلیک کردن روی پروژه یک فایل با نام Global.asax به پروژه اضافه نمائید

سپس بروی فایل اضافه شده دوبار کلیک نمائید و کد زیر را در قسمت مربوطه اضافه نمائید
protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}

در این صورت هر گونه کاری با تاریخ داشتید دات نت خودش براتون شمسی میکنه !!!

HOSSEINGHOLI
شنبه 31 تیر 1391, 16:47 عصر
یعنی حتی اگه از month calendar موجود در vs2010 استفاده کنم شمسی میشه؟

sanay_esh
شنبه 31 تیر 1391, 17:08 عصر
عرض کردم هر گونه کاری با تاریخ داشتید دات نت براتون بصورت شمسی انجام مید ه

تمامی امکانات کلاس Datetime بصورت شمسی در اختیار شما قرار دارد

HOSSEINGHOLI
یک شنبه 01 مرداد 1391, 16:38 عصر
مرسی بابت جوابتون حالا من چطوری میتونم تو windows form از این کلاس استفاده کنم.
اونجا که دیگه فایل global نداره باید چکار کنم؟

TeacherMath
یک شنبه 01 مرداد 1391, 17:31 عصر
میتو نید توی program تابع main() بنویسید

HOSSEINGHOLI
یک شنبه 01 مرداد 1391, 17:43 عصر
اونجا نوشتم ولی جواب نمیده
باید چیکار کنم؟

mojmadah
شنبه 18 شهریور 1391, 17:21 عصر
منظور از قسمت مربوطه تو فایل global.asax چیه؟

ramin149
یک شنبه 19 شهریور 1391, 02:00 صبح
عرض کردم هر گونه کاری با تاریخ داشتید دات نت براتون بصورت شمسی انجام مید ه

تمامی امکانات کلاس Datetime بصورت شمسی در اختیار شما قرار دارد

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

sanay_esh
یک شنبه 19 شهریور 1391, 10:42 صبح
کمی به کلاس اصلی در صفحه اول این تاپیک دقت کنی همه چیز معلومه خیلی هم سخت نیست

به این سایت (http://hasheminezhad.com/datepicker)هم مراجعه کنید متوجه میشوید

ramin149
یک شنبه 19 شهریور 1391, 11:00 صبح
کمی به کلاس اصلی در صفحه اول این تاپیک دقت کنی همه چیز معلومه خیلی هم سخت نیست

به این سایت (http://hasheminezhad.com/datepicker)هم مراجعه کنید متوجه میشوید

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

azygole
جمعه 14 مهر 1391, 23:14 عصر
با سلام خدمت آقای sanay_esh
از کدهای شما استفاده کردم خیلی خوب بود اما تقویم من فقط ماه و سالش شمسی شد و روزهاش میلادی باقی موند.باید چکار کنم؟

sanay_esh
یک شنبه 16 مهر 1391, 17:59 عصر
سلام

برای استفاده از این کلاس شما باید طبق گفته بند در صفحه اول این تاپیک یک global.asax ایجاد و در قسمت Application_BeginRequest این کد را قرار بدهید :



protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}




اما شما :

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

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

azygole
جمعه 28 مهر 1391, 22:34 عصر
با سلام و عرض پوزش از تاخیر در جواب
من با دستورات شما کار کردم به این نتیجه رسیدم که این کدها روی تقویم کامپوننتهای تاریخ devexpress کار نمی کنه . شاید هم چون global.asax رو نتونستم راه بندازم اینطوریه . آخه وقتی فایل global رو ایجاد می کنم و کد شما رو توش کپی می کنم این خطا رو می ده :
The name 'Thread' does not exist in the current context
جایی هم نداره که این خط رو اضافه کنم:
using System.Threading;
آخه این فایل رو اضافه کردم و توی فرم اولم یعنی default.aspx کدهای global.asax که گفته بودید وارد کردم و خطا نداد اما تقویم devexpress درست نشد ولی تقویم خود دات نت درست شد.
من منتظر کمک شما هستم . با تشکر فراوان

saeed_sho
جمعه 28 مهر 1391, 23:22 عصر
شما اینطوری بنویسید
System.Threading.Thread.CurrentThread.CurrentCultu re = persianCulture;

azygole
یک شنبه 30 مهر 1391, 22:30 عصر
سلام.خطا رفع شد اما تقویم شمسی نشد :ناراحت:

ali4545
دوشنبه 08 آبان 1391, 15:08 عصر
سلام
نتونستم دانلود کنم
خواهش می کنم برام ایمیل کنید
froo_kia1390@yahoo.com
متشکرم

sh
چهارشنبه 14 فروردین 1392, 22:14 عصر
ظاهراً روش قبلی بهبود پیدا کرده

http://www.codeproject.com/articles/250740/fixing-optional-calendars-for-persian-culture-in-n

اگر دوستان بتونن یه مثال واسه فارسی کردن monthcalendar یا datetimepicker درست کنند و اینجا بگذارند واقعا لطف میکنن

fardin_esmi
یک شنبه 08 اردیبهشت 1392, 19:24 عصر
جناب sanay_esh با استفاده از این کلاس و توضیحاتی که دادید من تقویم رو فارسی کردم اما یک سوال دارم:
چطور می تونم تاریخ رو در دیتابیس به صورت date ذخیره کنم ؟من کدهای زیر رو نوشتم اما هنگام ذخیره error میده :




protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
PersianCalendar pc = new PersianCalendar();
DateTime Date = Calendar1.SelectedDate;
TextBox1.Text =pc.GetYear(Date)+"/"+pc.GetMonth(Date)+"/"+pc.GetDayOfMonth(Date);
d1 = new DateTime(pc.GetYear(Date),pc.GetMonth(Date), pc.GetDayOfMonth(Date) ,pc);
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["calendarConnectionString1"].ConnectionString);
SqlCommand cmd = new SqlCommand("insert into dates (date) values ('" +d1+ "')",con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

Label1.Visible = true;
Label1.Text = "sabt shod";
GridView1.DataBind();

خطایی که میده اینه:

Specified time is not supported in this calendar. It should be between 03/21/0622 00:00:00 (Gregorian date) and 12/31/9999 23:59:59 (Gregorian date), inclusive.
Parameter name: time

sanay_esh
دوشنبه 09 اردیبهشت 1392, 12:56 عصر
با سلام خدمت شما دوست گرامی

شما باید نوع فیلد خود را در DB از نوع DateTime یا Date در نظر بگیرید و براحتی آن را میتوانید ذخیره نمائید

از طرفی اگر بخواهید بصورت رشته در DB ذخیره نمائید میتوانید از متد ToString() این تابع استفاده نموده و آنرا به رشته تبدیل و در بانک خود ذخیره نمائید

همین !!

fardin_esmi
سه شنبه 10 اردیبهشت 1392, 11:45 صبح
با سلام مجدد
من نوع فیلد رو هم date و هم datetime تعریف کردم اما باز هم خطا میگیره .ممکنه اشکال این کدهایی که گذاشتم بفرمایید کجاست؟

fardin_esmi
سه شنبه 07 خرداد 1392, 11:56 صبح
سلام مجدد
مشکلم با استفاده از پارامترها حل شد.

vahid_pitok
چهارشنبه 15 خرداد 1392, 13:35 عصر
سلام دوستان
من زمان رو به شمسی تبدیل کردم حالا می خوام زمان رو از دیتابیش چک کنم خطا می گیره؟
آیا می شه زمان رو به میلادی گرفت؟

ممنون می شم راهنمایی کنید

arash_abay
پنج شنبه 06 تیر 1392, 15:49 عصر
با سلام خدمت همه اساتید محترم ( بخصوص استاد گرانقدر جناب کرامتی ) و دوستان عزیز

برای استفاده از تقویم شمسی باید مراحل زیر را طی نمود:

ابتدا یک کلاس با محتویات زیر به پروژه خود اضافه نمائید:
public class PersianCulture : CultureInfo
{
private readonly Calendar cal;
private readonly Calendar[] optionals;


public PersianCulture()
: this("fa-IR", true)
{
}

public PersianCulture(string cultureName, bool useUserOverride)
: base(cultureName, useUserOverride)
{
//Temporary Value for cal.
cal = base.OptionalCalendars[0];

//populating new list of optional calendars.
var optionalCalendars = new List<Calendar>();
optionalCalendars.AddRange(base.OptionalCalendars) ;
optionalCalendars.Insert(0, new PersianCalendar());


Type formatType = typeof(DateTimeFormatInfo);
Type calendarType = typeof(Calendar);


PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars",
BindingFlags.Instance | BindingFlags.NonPublic);

//populating new list of optional calendar ids
var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);

optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);

optionals = optionalCalendars.ToArray();
cal = optionals[0];
DateTimeFormat.Calendar = optionals[0];

DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };


DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

DateTimeFormat.AMDesignator = "ق.ظ";
DateTimeFormat.PMDesignator = "ب.ظ";

/*
DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
DateTimeFormat.LongDatePattern = "yyyy/MM/dd";

DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy/MM/dd"}, 'd');
DateTimeFormat.SetAllDateTimePatterns(new[] {"dddd, dd MMMM yyyy"}, 'D');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'y');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'Y');
*/

}

public override Calendar Calendar
{
get { return cal; }
}

public override Calendar[] OptionalCalendars
{
get { return optionals; }
}

سپس با راست کلیک کردن روی پروژه یک فایل با نام Global.asax به پروژه اضافه نمائید

سپس بروی فایل اضافه شده دوبار کلیک نمائید و کد زیر را در قسمت مربوطه اضافه نمائید
protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}

در این صورت هر گونه کاری با تاریخ داشتید دات نت خودش براتون شمسی میکنه !!!
.................................................. ........................

با سلام خدمت شما و اساتید گرامی
باید بگم بسیار روش جالب و خلاقانه ای بودبود..
اما فقط میشه از این روش برای Calender مربوط به asp.net استفاده کرد..که متاسفانه DatePicker ندارد..و وقتی از کامپوننتهایی مثل Telerik استفاده میکنیم به مشکل بر میخوریم با این که در ابتدا همه چیز فارسی است ولی وقتی تاریخی select میشود روز آن شمسی ولی ماه و سال آن میلادی نوشته میشود..
آیا راهی برای این مسئله وجود دارد؟
ممنون.

alale66
دوشنبه 28 مرداد 1392, 11:07 صبح
با سلام
من میخوام از DateTimePicker فارسی تو پروژه WindowsApplication استفاده کنم.کلاس رو به پروژم اضافه کردم کد

var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;

رو هم به Main اضافه کردم ولی اتفاقی نیافتاد.
راهی هست بشه DateTinmePichker رو شمسیش کرد؟میشه راهنماییم کنید لطفا
ممنون

hinatiloos
جمعه 06 دی 1392, 20:09 عصر
سلام
من بشدت نیاز مند
DateTimePicker
و
month calendar
با تاریخ شمی هستم.
مثلا میشه
http://www.daypilot.org/demo/Month/
رو شمسی کرد؟

majid_i68
شنبه 19 بهمن 1392, 04:32 صبح
با سلام خدمت همه اساتید محترم ( بخصوص استاد گرانقدر جناب کرامتی ) و دوستان عزیز

برای استفاده از تقویم شمسی باید مراحل زیر را طی نمود:

ابتدا یک کلاس با محتویات زیر به پروژه خود اضافه نمائید:
public class PersianCulture : CultureInfo
{
private readonly Calendar cal;
private readonly Calendar[] optionals;


public PersianCulture()
: this("fa-IR", true)
{
}

public PersianCulture(string cultureName, bool useUserOverride)
: base(cultureName, useUserOverride)
{
//Temporary Value for cal.
cal = base.OptionalCalendars[0];

//populating new list of optional calendars.
var optionalCalendars = new List<Calendar>();
optionalCalendars.AddRange(base.OptionalCalendars) ;
optionalCalendars.Insert(0, new PersianCalendar());


Type formatType = typeof(DateTimeFormatInfo);
Type calendarType = typeof(Calendar);


PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars",
BindingFlags.Instance | BindingFlags.NonPublic);

//populating new list of optional calendar ids
var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);

optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);

optionals = optionalCalendars.ToArray();
cal = optionals[0];
DateTimeFormat.Calendar = optionals[0];

DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };


DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

DateTimeFormat.AMDesignator = "ق.ظ";
DateTimeFormat.PMDesignator = "ب.ظ";

/*
DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
DateTimeFormat.LongDatePattern = "yyyy/MM/dd";

DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy/MM/dd"}, 'd');
DateTimeFormat.SetAllDateTimePatterns(new[] {"dddd, dd MMMM yyyy"}, 'D');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'y');
DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'Y');
*/

}

public override Calendar Calendar
{
get { return cal; }
}

public override Calendar[] OptionalCalendars
{
get { return optionals; }
}

سپس با راست کلیک کردن روی پروژه یک فایل با نام Global.asax به پروژه اضافه نمائید

سپس بروی فایل اضافه شده دوبار کلیک نمائید و کد زیر را در قسمت مربوطه اضافه نمائید
protected void Application_BeginRequest(object sender, EventArgs e)
{
var persianCulture = new PersianCulture();
Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;
}

در این صورت هر گونه کاری با تاریخ داشتید دات نت خودش براتون شمسی میکنه !!!



کسی هست که از این کد استفاده کرده باشه ..من میخوام در برنامه ویندوز فرم monthCalendar رو فارسی کنم.. کلاس رو ساختم اما نمیدونم Application_BeginRequest رو باید چطور در تایع main قرار بدم

karimi.ali2005
دوشنبه 31 شهریور 1393, 11:07 صبح
کسی هست که از این کد استفاده کرده باشه ..من میخوام در برنامه ویندوز فرم monthCalendar رو فارسی کنم.. کلاس رو ساختم اما نمیدونم Application_BeginRequest رو باید چطور در تایع main قرار بدم
باید داخل program بنویسید

mdssoft
شنبه 06 دی 1393, 13:59 عصر
شما می تونید از کتابخانه زیر استفاده کنید، تمامی کارهای مورد نظر شما رو انجام میده

http://www.codeproject.com/Articles/850359/Persian-Calendar-PersianDateTime-in-Csharp

دکپریو
سه شنبه 09 دی 1393, 21:50 عصر
سلام بی زجمت بگین چطور میشه تو برنامم یه تقویم فارسی مثل کامپننت DateTimePicker1 درvb.net2010 داشته باشم بی زخمت اگه هست خیلی ساده توضیح بدین چطور استفاده کنم من زیاد بلد نیستم ممنون:متفکر:

mdssoft
سه شنبه 09 دی 1393, 23:16 عصر
اگر وب منظورتون هست که می تونید از DateTimePicker هایی مثل Bootstrap Persian DateTimePicker (http://www.codeproject.com/Articles/858123/Bootstrap-Persian-DateTimePicker) استفاده کنید اما در مورد ویندوزی می تونید سرچ کنید من ویندوزی کار نمی کنم

aliasghar2
چهارشنبه 10 دی 1393, 01:04 صبح
من خودم شخصا از اینکامپوننت استفاده میکنم با جاوا اسکریپ نوشه شده و خیلی هم زیباس نیاز به dll و یا jquery هم نداره
http://amib.ir/weblog/?page_id=316

mdssoft
چهارشنبه 10 دی 1393, 06:05 صبح
من خودم شخصا از اینکامپوننت استفاده میکنم با جاوا اسکریپ نوشه شده و خیلی هم زیباس نیاز به dll و یا jquery هم نداره
http://amib.ir/weblog/?page_id=316
DatePicker خیلی زیبایی بود
اما jquery plugin بودن و استفاده از bootstrap در بعضی از موارد مزیت حساب میشن
1- استفاده از bootstrap یعنی اینکه این تقویم responsive هست
2- با استفاده از jQuery میتوان به آبجکت های تقویم دسترسی پیدا کردم و پارامترهای اون رو تغییر داد
3- به علت استفاده از bootstrap تم تقویم کاملا به تم bootstrap وابسته هست و با عوض شدن تم bootstrap تم تقویم هم عوض میشود
4- Open Source هست و سورس آن minify نشده و کاملا قابل ویرایش است
5- می توان بدون نوشتن کد جاوا اسکریپت و تنها با Attribute های html تقویم رو فعال و یا غیر فعال کرد

ahad123
شنبه 13 دی 1393, 10:55 صبح
بهترین گزینه برای استفاده از تاریخ شمسی در برنامه ها استفاده از کلاس PersianCalendar خود دات نت است. تنها مشکلی که وجود دارد عدم امکان استفاده از آن به عنوان تقویم پیش فرض برنامه است که نصب این افزونه: http://persianculture.codeplex.com
محدودیت فوق برطرف می شود.

با سلام از این کلاس استفاده کردم ولی سال و ماه به میلادیه چرا...؟