PDA

View Full Version : سوال: نحوه نمایش تاریخ به صورت شمسی در گرید ویو؟



somayekhezri
دوشنبه 26 دی 1390, 11:38 صبح
سلام دوستان

نگید که تکراریه(دو روز همه جا رو گشتم چیز مد نظر رو پیدا نکردم)

من یک گرید ویو دارم که صرفا فقط برای نمایش اطلاعات استفاده میشه(یه فیلد تاریخ هم داره)

من تاریخ رو تو پایگا هم date گرفتم و با persiandatetimeبه صورت میلادی ذخیره میشه .

حالا تو این فرمم که گرید داره چطور بگم که این تاریخ ها رو به شمسی نشون بده؟

چون وقتی فرم لود میشه گرید رو با اطلاعاتش نشون میده.(اما با تاریخی که به صورت میلادی تو tableذخیره شده نشون میده)

ممنون

jprogramer
دوشنبه 26 دی 1390, 11:52 صبح
سلام دوست عزیز یه سری به این تایپیک بزن
http://‬http://barnamenevis.org/showthread.php?283412-%D9%82%D8%B1%D8%A7%D8%B1-%D8%AF%D8%A7%D8%AF%D9%86-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AF%D8%B1-%DA%A9%D8%B1%DB%8C%D8%B3%D8%AA%D8%A7%D9%84-%D8%B1%DB%8C%D9%BE%D9%88%D8%B1%D8%AA

somayekhezri
دوشنبه 26 دی 1390, 12:55 عصر
سلام ممنون از لطفتون
ولی این تاپیک مورد داره.باز نمیشه

gilas1368
دوشنبه 26 دی 1390, 13:02 عصر
من خودم داخلم پایگاهم برای تاریخ از نوع nvarchar استفاده میکنم
چون یه رشتس کار کردن باهاش راحتره و نیازی به تبدیل تاریخم نیست
آخه چون رشتس تاریخی رو که میدی به عنوان یه رشته insert میکنه

somayekhezri
دوشنبه 26 دی 1390, 13:08 عصر
ممنون ازت ولی

آخه از لحاظ اصولی درست نیست که تاریخ رو رشته بگیریم.

حتما باید date میگرفتم.

لطفا دوستان راهنماییم کنند.

amir11205
دوشنبه 26 دی 1390, 15:38 عصر
دوست عزیز سلام
میتونی تاریخ رو با استفاده از خود SQL به شمسی تبدیلش کنی و بعد فقط با انجام یه select از دیتابیس و بایند کردن اون به دیتا گرید ویو این کار رو اجام بدی.
اگه بلد باشی میتونی از UDF استفاده کنی که با یه سرچ میتونی در موردش اطلاعاتی بدست بیاری .به صورت زیر:


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Globalization;

public partial class UserDefinedFunctions
{
public static SqlString GetShamsiDate(SqlDateTime datetime)
{
if (datetime.IsNull)
{
return null;
}
DateTime dt = (DateTime)datetime;
PersianCalendar pc = new PersianCalendar();
string Year = pc.GetYear(dt).ToString();
string Month = pc.GetMonth(dt).ToString("D2");
string Day = pc.GetDayOfMonth(dt).ToString("D2");
return Year + "/" + Month + "/" + Day;
}
};
حالا نوبت اینه که select رو به صورت زیر انجام بدیو بعد بایند کنی:


SELECT dbo.GetShamsiDate(date) as date from table
فقط یادتون باشه باید کار با UDF رو یاد بگیری که خیلی آسونه و اگه یه سرچ بزنی حله
بازم اگه سوالی داشتی بپرس
در ضمن این الگو یه ایرادی داره اینه که select شما در هر سطری که میخونه تابع GetShamsiDate رو تو sql فراخوانی میکنه که باعث کندی سرعت میشه
پس اگه حجم اطلاعاتتون زیاده یهتره که همه سطرها رو بایند نکنین و به صورت page نشون بدین.مثلا دیتاگریدتون 20 تا سطر داشته باشه و بقیه اطلاعات تو صفحه دیگه باشن و شما برای دیدن مابقی next رو بزنین و در هربار next کردن 20 تای بعدی select بشه و نشون داده بشه(یه چیزی تو این مایه ها)
این روش کلا برای نمایش اطلاعلات بهتره

jprogramer
سه شنبه 27 دی 1390, 10:47 صبح
من به صورت زیر عمل کردم و جواب داده.
1- تابع تبدیل تاریخ میلادی به شمسی
public string Miladi2Shamsi(DateTime _date)
{
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append("/");
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append("/");
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
string total = sb.ToString();
return total.ToString();
}
2- یه کامپوننت تایمر رو فرم گذاشتم
بعد در رویداد tick تایمر :
private void timer1_Tick(object sender, EventArgs e)
{
lbltarikh.Text = Miladi2Shamsi(DateTime.Today);

}
3- مقدار کامپوننت lbltarikh.text رو که در واقع تاریخ روز می باشد بانک اطلاعاتی ثبت میکنم
4- به همین راحتی هیچ مشکلی هم پیش نمی اد امتحان بکن جواب میگیری
راستی یادم رفت نوع تاریخ رو nvarchar تعریف بکن