مشاهده نسخه کامل
: مشکل در تاریخ
M.Hashemi
13-11-2010, 11:57
با سلام
برای این که استانداردها را رعایت کنم تاریخ را به صورت DateTime تعریف کردم.
توابع تبدیل شمسی به میلادی و میلادی به شمسی را هم پیدا کردم.
حال این کد را در چه event بنویسم که برای تک تک رکوردها در DataGridView اعمال بشه و زمانی که کاربر با کلیک کردن روی سر ستون ها می خواهد جدول را sort کند مشکلی به وجود نیاد.
با تشکر
با سلام
-برای انجام این کار اگر در برنامه از یک معماری چند لایه استفاده می کنید به راحتی می توانید کلاس مدلتان را طوری طراحی کنید که این کار را انجام دهد.مثلا اگر در کلاس مدلتان یک خصیصه با نام Date و از نوع DataeTime دارید که تاریخ میلادی را از دیتابیس مستقیما به داخل آن می ریزید و یک خصیصه فقط خواندنی دیگر به نام PersianDate دارید که تاریخ تبدیل شده فارسی را بر می گرداند(لازم به ذکر است با اضافه شدن DLR به دات نت 4 و با استفاده از مدل های دینامیکی این کار بسیار ساده تر خواهد بود و کد نویسی خیلی کمتری هم دارد)
-شی DataTable واکشی شده را قبل از بایند کردن به DataGridView و نمایش آن تغییر دهید تا تاریخی که می خواهید را نمایش دهد و بعد به GridView بایندش کنید
-GridView یک رویداد به نام CellFormating داره که داخلش می تونید مقدار یک ستون را تغییر دهید(البته نوع یک ستون را نمی توانید عوض کنید!)
موفق باشید
M.Hashemi
13-11-2010, 19:17
با سلام
از پاسخ mahdi7s متشکرم
من مدت زیادی نیست که با visual studio کار می کنم و اطلاعات زیادی ندارم.
اما از گفته های شما این را برداشت کردم :
1- ابتدا با استفاده از کد زیر یک ستون یا فیلد به جدولم در DataSet اضافه کردم.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
2- با استفاده از یک حلقه for که شمارنده ان از 0 تا تعداد رکوردها است را نوشتم و در ان خط به خط میلادی را به شمسی تبدیل کرده و در ستون جدید ذخیره کردم و DataSet را Bind کردم.
البته تمامی کد ها را در OnLoad نوشتم.
ایا من راه درستی را رفتم؟
ایا راه دیگری وجود دارد؟
با تشکر
M.Hashemi
13-11-2010, 20:25
با سلام
یک راه دیگر هم وجود دارد که به جز تاریخ میلادی تاریخ شمسی را نیز در پایگاه داده ذخیره کنیم.
میلادی را از نوع DateTime و شمسی را از نوع string .
که در این صورت برای نمایش در DataGridView و مشکلی نداریم و از فیلد شمسی استفاده می کنیم و برای استفاده از توابع تاریخ از فیلد DateTime استفاده می کنیم.
نظر شما چیست؟
با تشکر
یک راه دیگر هم وجود دارد که به جز تاریخ میلادی تاریخ شمسی را نیز در پایگاه داده ذخیره کنیم.
میلادی را از نوع DateTime و شمسی را از نوع string .
که در این صورت برای نمایش در DataGridView و مشکلی نداریم و از فیلد شمسی استفاده می کنیم و برای استفاده از توابع تاریخ از فیلد DateTime استفاده می کنیم.
نظر شما چیست؟
خوب است - اما باید به یک چیز دقت کنید:
برنامه شما در UI تماما" با تاریخ شمسی کار می کند ولی در کد با تاریخ میلادی-و هر گونه تغییری در تاریخ شمسی باید در تاریخ میلادی هم اعمال شود و بلعکس (البته این تبدیل لازم نیست همه جا انجام شود و بهتر است در موارد ثبت و ویرایش تاریخ انجام شود)
توجه:در برنامه هایی که نیاز دارند تاریخ های زیادی را به این شکل پیاده سازی کنند باید به سرعت و کارایی برنامه هم توجه کنید.
در کل و از نظر من راه اولی که گفتم بهتر است و از نوشته شدن کدهای تکراری و اسپاگتی هم جلوگیری می کند (قشنگ تر از همش آن قسمت دینامیکش هست!).
موفق باشید.
M.Hashemi
13-11-2010, 23:26
با سلام
mahdi7s عزیز برای پست سوم نظری ندارید؟
بقیه دوستان در مورد این مسئله نظری ندارند؟
با تشکر
L u K e !
14-11-2010, 09:35
نه اصلا روش خوبی نیست این کار
واسه جستجو به مشکل بر می خوری
خوب کاری نداره که شما برنامه تو بر 3layer پیاده کن بعد موقع لود کردن توی برنامه نویسی String در نظرش بگیر و شمسی ش کن ولی موقع insert و update میلادی ش کن و بفرست به بانکت
سلام
همانطور که در خارج از گراید میتوانید کنترلری برای تقویم فارسی داشته باشید که پایانه ورودی/خروجی ان در برنامه میلادی ولی نمایه دیداری و ارتباط با کاربر ان شمسی باشد.
در گراید هم عیناً میتوانید همچین الگویی را پیاده سازی کنید.
میتوانید ستون سفارشی برای گراید طراحی کنید که مستقیم به فیلد تاریخ (میلادی) دیتابیس وصل شود ولی تاریخ را شمسی نشان داده و شمسی از کاربر بگیرد.
حتی با صرف کمی وقت بیشتر میتوان ان را به حالت Combo در داخل گراید هم ارتقاء داد.
این روش بهترین بازدهی دارد.
چون تبدیل به شمسی فقط برای فیلدهایی رخ میدهد که الآن در روی قاب گراید در حال دیده شدن هستند و تبدیل به میلادی هم فقط وقتی رخ میدهد که موردی توسط کاربزر ویرایش شود.
این مورد هم از جهت کدنویسی خیلی ساده تر و بدون پیچیدگی است و هم بازدهی خوبی دارد.
مثال یک نمونه عملی:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
موفق باشید.
M.Hashemi
14-11-2010, 10:17
با سلام
از پاسختون متشکرم L u K e !
اما به نظر شما اگر این کار را انجام بدم لود form طولانی نمیشه؟(حدود 1000 رکورد).
با تشکر
M.Hashemi
14-11-2010, 10:30
با سلام
از _h2_ عزیز متشکرم.
من قبلا دلفی کار می کردم و در events های مربوط به grid ان یک event به نام OnCalcField بود که برای تک تک رکوردها اجرا می شد و من می توانستم برای تک تک رکوردها هنگام load در grid تبدیل تاریخ را انجام دهم.
حال یک سوال :
1- _h2_ عزیز لطفا توضیح دهید کد تبدیل تاریخ را در چه event از dataGridView نوشته اید؟
(چون اگر اشتباه نکنم Grid را به صورا dll گذاشته بودید و تمام مشکل من هم دقیقا همان کد های هستند که باید در grid نوشته شوند.)
ممنون میشم جواب دهید.
با تشکر
نه اصلا روش خوبی نیست این کار
واسه جستجو به مشکل بر می خوری...
در جدول یک فیلد Date و فیلد دیگری به نام PersianDate وجود دارد که اولی تاریخ میلادی و دومی تاریخ شمسی آن را نمایش می دهد...
می خوام بدونم کجای این در جستجو ما را به مشکل می رسونه؟
----------------------------------------------------------------------------------------------------------------
در ضمن فکر می کنم این کار شما در هر حالتی مشکل دارد چون پرسیده اید آیا مشکل دارد!
موفق باشید
سلام
کد تبدیل تاریخ را در چه event از dataGridView نوشته اید؟
(چون اگر اشتباه نکنم Grid را به صورا dll گذاشته بودید و تمام مشکل من هم دقیقا همان کد های هستند که باید در grid نوشته شوند
این بیشتر مبحثی شی گرایی است.
گراید گراید عادی خود دات نت است، چیزیکه dll است فقط یک column شمسی برای گراید است.
شما رویدادی را کد نویسی نمیکنید و بعداض در محل استفاده گراید هم لازم به کدنویسی خاصی نیست.
شما یک class جدید column ایجاد میکنید و ستون های گرایدتان را از این نوع تعریف میکنید.
دقیقاً مثل زمانی یک کنترلر را با وراثت یا usercontrol میسازد و در همان محل تعریف کدنویسی میکنید و بعد در محل استفاده فقط ان را روی فرم قرار میدهید.
نمونه ساده ای از همان dll شمسی برای گراید را با سورس میتوانید از زیر دانلود کنید.
این دیگر هیچ dll ای ندارد، هرچه دارد همان کدنویسی های داخل پروژه است.
به کدها دقت کنید متوجه روش کلی کار خواهید شد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.