PDA

View Full Version : سوال: نمايش تاريخ شمسي در ديتا گريد



Iran58
یک شنبه 30 خرداد 1389, 07:20 صبح
سلام
ديتا گريد برنامه ام را به جدولي بايند كرده ام و اطلاعات جدول را در ديتاگريد نمايش مي دهم حال مشكل من اينست كه تاريخ را در جدول بصورت ميلادي ذخيره مي كنم و مي خواهم درستون مربوطه ديتاگريدم بصورت شمسي نمايش داده شود براي اين كار چه كدي در ديتاگريدم بنويسم
باتشكر

NIK
یک شنبه 30 خرداد 1389, 07:30 صبح
سلام
من برای حل این مشکل اول اطلاعات دیتابیسم رو تو یه دیتاتیبل میریزم بعد سطر به سطر تاریخ رو به شمسی برمیگردونم و در نهایت گریدویو رو به دیتاتیبل متصل میکنم.

انیشتین
یک شنبه 30 خرداد 1389, 09:09 صبح
کار درست و اصولی اینه که از اول تاریخ رو بصورت شمسی ذخیره کنی.
یعنی تاریخ رو تو دیتا بیس کاراکتر بگیری بعد با استفاده از یک تابع تو اینتر فیس اونو تبدیل به شمسی کنی و تاریخ شمسی رو بصورت رشته در دیتا بیس ذخیره کنی . همه جا همین کار رو میکنن.

NIK
یک شنبه 30 خرداد 1389, 09:25 صبح
کار درست و اصولی اینه که از اول تاریخ رو بصورت شمسی ذخیره کنی.
یعنی تاریخ رو تو دیتا بیس کاراکتر بگیری بعد با استفاده از یک تابع تو اینتر فیس اونو تبدیل به شمسی کنی و تاریخ شمسی رو بصورت رشته در دیتا بیس ذخیره کنی . همه جا همین کار رو میکنن.

من دقیقاً همین کار رو در یک پروژه کوچیک انجام دادم اما وقتی که تعداد رکوردهای برنامه زیاد شد، برای پردازش بر روی تاریخ و مقایسه اونها با هم زمان سرعت برنامه خیلی اومد پائین.

روشی که بنده عرض کردم سرعت بالاتری نسبت به روش قبلی داره و فقط حجم دیتابیس کمی بیشتر میشه.

انیشتین
یک شنبه 30 خرداد 1389, 10:04 صبح
برادر جان راهی که گفتم تو همه شرکت ها و برنامه های واقعی استفاده میشه و مشکلی نداره.
شاید شما بدرستی پیاده سازی نکردی.
اگر از این روش استفاده کنی جدول رو مستقیم به گرید ویو وصل میکنی و دیگه لازم نیست رو تک تک فیلد هاش کار انجام بدی.فکر کن شاید چند هزار تا رکورد داشته باشی...
این راهی که من گفتم فقط یه تابع کوچیک تو اینتر فیس تاریخ رو تبدیل میکنه و کار دیگه ای لازم نیست که سرعت پایین بیاد.

Iran58
یک شنبه 30 خرداد 1389, 10:29 صبح
سلام
من برای حل این مشکل اول اطلاعات دیتابیسم رو تو یه دیتاتیبل میریزم بعد سطر به سطر تاریخ رو به شمسی برمیگردونم و در نهایت گریدویو رو به دیتاتیبل متصل میکنم.
باسلام
با يك كد ميشه بيشتر توضيح دهيد

NIK
یک شنبه 30 خرداد 1389, 10:41 صبح
برادر جان راهی که گفتم تو همه شرکت ها و برنامه های واقعی استفاده میشه و مشکلی نداره.
شاید شما بدرستی پیاده سازی نکردی.
اگر از این روش استفاده کنی جدول رو مستقیم به گرید ویو وصل میکنی و دیگه لازم نیست رو تک تک فیلد هاش کار انجام بدی.فکر کن شاید چند هزار تا رکورد داشته باشی...
این راهی که من گفتم فقط یه تابع کوچیک تو اینتر فیس تاریخ رو تبدیل میکنه و کار دیگه ای لازم نیست که سرعت پایین بیاد.

دوست من زمانی ممکن است شما نیاز داشته باشید رکورهای بین دو تاریخ رو بدست بیارین.
اونوقت با یک Select معمولی نمیتونین این کار رو انجام بدین. نیاز به یه ایتورپروسیجر یا ... دارین که بتونه تاریخ های بین این بازه رو شناسایی کنه.
اگه من نظری دادم چون دقیقاً خودم با این مشکل مواجه شدم و سرعت برنامم پائین اومده.
البته نظر شما هم محترمه :لبخندساده:

NIK
یک شنبه 30 خرداد 1389, 11:09 صبح
باسلام
با يك كد ميشه بيشتر توضيح دهيد

اول یه من بگید قصد دارید دوباره اطلاعات رو در گریدویو ویرایش کنید؟

Iran58
یک شنبه 30 خرداد 1389, 12:50 عصر
اول یه من بگید قصد دارید دوباره اطلاعات رو در گریدویو ویرایش کنید؟
باسلام
نخيرفقط نمايش ميخواهم بدهم

sepideh_aghel
یک شنبه 30 خرداد 1389, 13:04 عصر
توی DataBindingComplete کد زیر رو می تونی استفاده کنی

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for(int i=0;i<dataGridView1.Rows.Count-1;i++)
{
dataGridView1.Rows[i].Cells[0].Value = changeDate((DateTime)dataGridView1.Rows[i].Cells[0].Value);
}
}
تابع change date هم

private string changeDate(DateTime dateend)
{
string RetDate;
PersianCalendar p = new PersianCalendar();
if ((p.GetMonth(dateend) < 10) && (p.GetDayOfMonth(dateend) < 10))
{
RetDate = string.Format("{0}/0{1}/0{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
else if (p.GetMonth(dateend) < 10)
{
RetDate = string.Format("{0}/0{1}/{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
else if (p.GetDayOfMonth(dateend) < 10)
{
RetDate = string.Format("{0}/{1}/0{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
else
RetDate = string.Format("{0}/{1}/{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
return RetDate;
}

mahdi87_gh
یک شنبه 30 خرداد 1389, 13:21 عصر
کار درست و اصولی اینه که از اول تاریخ رو بصورت شمسی ذخیره کنی
حرف دوستمون انیشتین کاملا درسته

دوست من زمانی ممکن است شما نیاز داشته باشید رکورهای بین دو تاریخ رو بدست بیارین.
اونوقت با یک Select معمولی نمیتونین این کار رو انجام بدین
با این حرف شما موافق نیستم!!
به راحتی میتونید در یک select رکوردهای مابین دو تاریخ رو استخراج کنید. البته به این شرط که شما تاریخ رو به صورت کامل و 10 حرفی درون بانک ذخیره کنید. یعنی 1389/1/1 رو بصورت 1389/01/01 ذخیره کنید

Iran58
چهارشنبه 02 تیر 1389, 08:16 صبح
5164551645
توی DataBindingComplete کد زیر رو می تونی استفاده کنی

privatevoid dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for(int i=0;i<dataGridView1.Rows.Count-1;i++)
{
dataGridView1.Rows[i].Cells[0].Value = changeDate((DateTime)dataGridView1.Rows[i].Cells[0].Value);
}
}
تابع change date هم

privatestring changeDate(DateTime dateend)
{
string RetDate;
PersianCalendar p = newPersianCalendar();
if ((p.GetMonth(dateend) < 10) && (p.GetDayOfMonth(dateend) < 10))
{
RetDate = string.Format("{0}/0{1}/0{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
elseif (p.GetMonth(dateend) < 10)
{
RetDate = string.Format("{0}/0{1}/{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
elseif (p.GetDayOfMonth(dateend) < 10)
{
RetDate = string.Format("{0}/{1}/0{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
}
else
RetDate = string.Format("{0}/{1}/{2} ", p.GetYear(dateend), p.GetMonth(dateend), p.GetDayOfMonth(dateend));
return RetDate;
}

سلام
هنگام كار باكد بالابه ارور زيربرخورده ام لطفاراهنماي كنيد

sepideh_aghel
چهارشنبه 02 تیر 1389, 09:36 صبح
تاریخی که برای تابع ارسال کردید چه تاریخی؟اگر تاریخ صحیح نباشد error میده

Iran58
چهارشنبه 02 تیر 1389, 09:56 صبح
تاریخی که برای تابع ارسال کردید چه تاریخی؟اگر تاریخ صحیح نباشد error میده
سلام
تاريخ براساس سال ،ماه ، روز وساعت مي باشد(2010/01/01/10:20:25)
هم درديتاگريد تاريخ رابصورميلادي صحيح نمايش مي دهد(بدون ارور)وهم دربانك صحيح ثبت مي شود