PDA

View Full Version : تبدیل تاریخ در DataGrid



fotovat
پنج شنبه 08 فروردین 1387, 12:06 عصر
درود

ما یه datagrid داریم که اطلاعات رو از sql server می خونه و یه ستون داره که تاریخ و زمان هست بصورت میلادی؛ چطور باید با استفاده از persiancalendar خود .net عمل تبدیل تاریخ میلادی به شمسی رو انجام بدم ؟ یا با shamsidll

(استفاده از farsilibrary مناسب نیست برای کار من وگرنه همچین قابلیتی داره )


ممنون

bad_boy_2007
پنج شنبه 08 فروردین 1387, 15:37 عصر
درود

ما یه datagrid داریم که اطلاعات رو از sql server می خونه و یه ستون داره که تاریخ و زمان هست بصورت میلادی؛ چطور باید با استفاده از persiancalendar خود .net عمل تبدیل تاریخ میلادی به شمسی رو انجام بدم ؟ یا با shamsidll

(استفاده از farsilibrary مناسب نیست برای کار من وگرنه همچین قابلیتی داره )


ممنون

بهتره یک StoresProcedure بنویسی که عمل تبدیل تاریخ رو در دستور Select انجام بده
برای اطلاعات بیشتر به این تاپیک یه سری بزن
http://barnamenevis.org/forum/showthread.php?t=52880&highlight=%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE+%D8%B4%D9 %85%D8%B3%DB%8C&page=3
من از تابعی که کاربر Linux نوشته استفاده میکنم و تا الان هم هیچ مشکلی نداشتم

fotovat
پنج شنبه 08 فروردین 1387, 21:33 عصر
ممنونم اما اگر بخواهیم از طریق .net عمل کنیم به چه صورت هست ؟ آیا باید convert کرد ستون رو ؟

bad_boy_2007
جمعه 09 فروردین 1387, 00:47 صبح
ممنونم اما اگر بخواهیم از طریق .net عمل کنیم به چه صورت هست ؟ آیا باید convert کرد ستون رو ؟

به سختی !
باید تک تک رکوردهای داخل دیتاست رو بخونی و فیلد تاریخشو تبدیل کنی و بعد بریزی سر جاش !!
اگه از همون StoredProcedure آقای Linux استفاده کنی خیلی ساده تر و سریع تره

gdevnb
سه شنبه 13 فروردین 1387, 10:48 صبح
برای اینکه کارت ساده تر بشه اطلاعات رو که داخل گرید ریختی تو ایونت
CellValueChanged برو و مقدار مورد نظرت رو کانورت کن و در سطری که توش هستی قرار بده




private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) Return;

if ((e.ColumnIndex == 3) )
{
string str = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
//Convert
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = vlu;
}

}

bad_boy_2007
جمعه 16 فروردین 1387, 10:39 صبح
برای اینکه کارت ساده تر بشه اطلاعات رو که داخل گرید ریختی تو ایونت
CellValueChanged برو و مقدار مورد نظرت رو کانورت کن و در سطری که توش هستی قرار بده




private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) Return;

if ((e.ColumnIndex == 3) )
{
string str = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
//Convert
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = vlu;
}

}






برای تعداد رکوردهای زیاد این شیوه مناسب نیست ، بهتره از یک حلقه For استفاده کنه . ولی در هر حال بهتره که یک Stored Procedure بنویسی :چشمک:
در ضمن کد شما یک حلقه بی نهایت از زخدادها رو ایجاد میکنه ، برای جلوگیری از این مشکل باید یه شرطی رو چک کنی که اگه خودت باعث تغییر رکورد شده باشی رویداد Change رخ نده و این خودش یک سرباز اضافه محسوب میشه .

gdevnb
شنبه 17 فروردین 1387, 02:11 صبح
حق با شماست
ولی من در حالت نمایش اطلاعات از این کد استفاده می کردم و DataGrid رو قابل ویرایش نمی کردم در کل روش ساده ای هستش ولی من هم Stored Procedure رو پیشنهاد می کنم

__H2__
دوشنبه 19 فروردین 1387, 10:33 صبح
سلام
من برای کنترلر DataGridView (و نه DataGrid) یک نوع Column جدید درست کرده ام که به راحتی در مجموعه Columns ها در زمان طراحی (در لیست مربوطه دیده میشود.) جای میگیرد و با انتخاب این نوع ستون، دیگر هیچ کد و کار خاصی لازم نیست، و اطلاعات را شمسی نشان میدهد و اجازه ویرایش شمسی را میدهد ولی اطلاعات را از دیتابیس اصلی میلادی (System.DateTime یا همان Date در VB) میخواند و مینویسد.

اگر بدردتان میخورد میتوان آخرین نسخه dll اش را برایتان آپلود کنم ولی توجه کنید که با DataGridView کار میکند نه DataGrid قدیمی موجود در دات نت.

gdevnb
دوشنبه 19 فروردین 1387, 12:49 عصر
نیکی و پرسش!

vahiddastitash
دوشنبه 19 فروردین 1387, 14:39 عصر
می خواستم یه datagrid یا یک datagridview داشته باشم که داخل grid مورد نظر یه combobox با سه ستون idو name و family وجود داشته باشد و بتوان grid را با combo مورد نظر update کرد

ezamnejad
سه شنبه 20 فروردین 1387, 15:50 عصر
سلام
من برای کنترلر DataGridView (و نه DataGrid) یک نوع Column جدید درست کرده ام که به راحتی در مجموعه Columns ها در زمان طراحی (در لیست مربوطه دیده میشود.) جای میگیرد و با انتخاب این نوع ستون، دیگر هیچ کد و کار خاصی لازم نیست، و اطلاعات را شمسی نشان میدهد و اجازه ویرایش شمسی را میدهد ولی اطلاعات را از دیتابیس اصلی میلادی (System.DateTime یا همان Date در VB) میخواند و مینویسد.

اگر بدردتان میخورد میتوان آخرین نسخه dll اش را برایتان آپلود کنم ولی توجه کنید که با DataGridView کار میکند نه DataGrid قدیمی موجود در دات نت.
چی شد پس چرا آپلود نکردید ؟؟؟؟؟

reza6384
سه شنبه 20 فروردین 1387, 18:25 عصر
در یکی از تاپیک های این تالار راجع به تقویم فارسی توی دیتاگرید بحث شده بود که الان لینکش و اون دوستی که اینSolution رو داده بودن یادم نیست.

ایشون گفتن که توی یک جدول که دو تا ستون داره ، یکی روز میلادی از نوع DateTime و اون یکی روز فارسی از نوع String. که روز میلادی Primary Key این جدوله. توی این جدول روزهای میلادی و روز فارسیش رو از 10 سال پیش تا 10 سال آینده ذخیره کردن و بعد هر جا که نیاز دارن روز فارسی رو از روی اون جدول می خونه ، مثلا :



Select F.Factor_ID,PC.PersianDate From Factors As F, PersianCalendar As PC
Where F.FactorDate = PC.EnglishDate


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

__H2__
چهارشنبه 21 فروردین 1387, 14:27 عصر
سلام

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

در نتیجه در تاپیک هایی که شرکت میکنم، معمولاً چند روز بین پستهایم فاصله می افتد.
در همینجا از همه دوستان عضر خواهی میکنم و از صبرشان و شکیبایی شان تشکر میکنم.

نسخه فوق در این مورد فوق العاده ساده است و البته صد در صد مشکل کارایی و سرعت ندارد.
چون تبدیل فقط در مورد سلول هایی که در محدوده دید تأیین شده توسط scroll هستند انجام میشود و نه بیشتر.
(یعنی سلول هایی از گراید که دیده میشوند)
تبدیل برعکس هم فقط وقتی ویراشی در سلولی رخ دهد، در همان سلول اتفاق می افتد.

مدتها است که دارم با دستورات +GDI کنترلر کامل تقویم شمسی با قابلیت تغییر در هر جزء کوچک و به دلخواه کردن.
ولی به علت کمی وقت تمام نشده.
اگر تمام شود بی شک همین ستون را پیشرفته میکنم، به طوری که کنترلر تقویم به صورت combo در سلول با کلیک نمایش داده شود.
ولی فعلاً که وعده ...

این نمونه شامل یک برنامه نمونه به همراه dll است.
برنامه نمونه جدولی با دو فیلد دارد ولی گراید سه فیلد دارد.
فیلد تاریخ یک بار در ستون عادی نمایش داده شده و یکبار هم در ستون تاریخ شمسی.
برنامه نمونه با 2008 وتحت فریم ورک 2 درست شده ولی در 2005 باز نمیشود.
در 2005 برای دیدن برنامه نمونه در VS میتوانید NewProject بزنید فرم اصلی را به پروژه جدید اضافه کنید.
(البته میتوانید به دیدن exe برنامه در شاخه bin هم اکتفا کنید.)

طریقه استفاده هم راحت است، بعد از اضافه کردن Refrence در تعریف ستون های datagridview برای هر ستون که تاریخی بود از DataGridViewIrDateColumn استفاده کنید.
جمیعاً موفق باشید.

لینک دانلود جدید:
http://h02.ir/Download.aspx?File=DataGridViewIrDateColumn.zip

ezamnejad
چهارشنبه 21 فروردین 1387, 17:40 عصر
اگر براتون امکان داره سورس برنامه را هم قرار بدهید .

__H2__
شنبه 24 فروردین 1387, 11:34 صبح
سلام
الان نمیتوانم، و اصلاً نمیخواستم پست دهم.
ولی گفتم باز صبر دوستان تمام میشود ....
کمی فرصت دهید ...

__H2__
دوشنبه 26 فروردین 1387, 10:27 صبح
سلام
این نمونه ساده برایتان درست کردم، که با وجود کد بسیار مختصر ولی به خوبی کار میکند.
میتوانید به دلخواه و به سادگی قابلیت هایش را افزایش دهید، مثلاً تعریف property برای تایین محدوده مجاز انتخاب کاربر (Max و Min) و...

کد واضح است و نکته قابل ذکری ندارد. ولی مطلب جالب تشخیص DataGridView از ستون جدید است.
من خودم وقتی اولین بار کد اولیه را نوشتم، (بگذریم که از کارکردنش هم اطمینان نداشتم) گفتم سر تشخیص خودکارش در لیست DGV گیر میکنم و شاید مجبور بشم با کد دستی ستون جدید را خوراک DGV کنم!
ولی با کمال خوشحالی دیدم خود DGV اسمبلی های Refrence را اسکن کرده و ستون جدید را تشخیص داده و به لیست اضافه کرده.


در مورد آن نمونه قبلی همراه با dll ای که گذاشتم نکته ای قابل ذکر است.
به کلاسس ستون مورد نظر چند خصوصیت زیر را اضافه کرده ام
MaxDate حداکثر تاریخ قابل انتخاب توسط کاربر
MinDate حداقل تاریخ قابل انتخاب توسط کاربر
IsSqlServerSmallDateTime حداکثر و حداقل متانظر گنجایش نوع فیلد smalldatetime در SQLServer شوند.
Format
که فرمت نحوه نمایش را مشخص میکند و از قواعد حاکم بر Date.ToString میلادی دات نت پیروی میکند. مثلاً در دات نت MMMM در رشته فرمت نشانگر نام ماه است، در این خصویت هم همین طور است ولی با نام و معیارهای شمسی.

و نشان دادن و تبدیل طبق رشته فرمت به درستی و کاملی کار میکند مثل:
(مثلاً اگر تاریخ 24 فرودین 1387 بود)


yyyy/MM/dd -> 1387/01/24 (پیش فرض)
yyyy/M/d -> 1387/1/24
yy/MM/dd -> 87/01/24

yyyy-MM-dd -> 1387-01-24


ddddd dd MMMM yyyy -> شنبه 24 فروردین 1387

,...
,...
etc

(یک سری فرمت ها که فاصله دارند در حالت RightToleft و LeftToRight شاید یک چرخش برعکس در نمایش پیدا کنند.)
اما وقت نکرده ام تبدیل برعکس dddd دارها را کامل کنم، مثلاً میتواند "24 فروردین 1387" را به معادل میلادی تبدیل کند ولی نمیتواند "شنبه 24 فروردین 1387" را به معادل میلادیش تبدیل کند، در صورت نیاز به dddd فقط باید در DGV های ReadOnly (مثلاً میخواهید گزارشی را نشان دهید) استفاده کنید.