PDA

View Full Version : سوال: افزودن قابلیت Undo Redo به برنامه



Mojtaba.Kh
پنج شنبه 07 آبان 1388, 08:51 صبح
با سلام
توی یه فرم که متشکل از یک DataGrid هست میخوام قابلیت یک یا چند مرحلهبازگرداندن تغییرات قبل از آپدیت تو دیتابیسم رو داشته باشم

به نظر شما بهترین روش جهت انجام این کار چیست؟

متشکرم

اَرژنگ
پنج شنبه 07 آبان 1388, 09:00 صبح
با سلام
توی یه فرم که متشکل از یک DataGrid هست میخوام قابلیت یک یا چند مرحلهبازگرداندن تغییرات قبل از آپدیت تو دیتابیسم رو داشته باشم

به نظر شما بهترین روش جهت انجام این کار چیست؟

متشکرم
۱.این را در چند مرحله برایه داتابیس نباید ساخت.
۲.برایه چیزهایه اینطوری معمولاً فقط یک کنسل و یا سیو بیشتر استفاده نمیشه، اگر دلیل اینکه چرا به چند مرحله عقب و جلو رفتن را بگید شاید جوابی که دنبالش میگردید اصلاً چیزه دیگری باشد.

system32
پنج شنبه 07 آبان 1388, 09:47 صبح
بهتر است از پایگاه داده خود بک آپ بگیرید و برای آندو کردن دوباره از آن پایگاه داده استفاده کنید.

Mojtaba.Kh
پنج شنبه 07 آبان 1388, 11:27 صبح
۱.این را در چند مرحله برایه داتابیس نباید ساخت.
۲.برایه چیزهایه اینطوری معمولاً فقط یک کنسل و یا سیو بیشتر استفاده نمیشه، اگر دلیل اینکه چرا به چند مرحله عقب و جلو رفتن را بگید شاید جوابی که دنبالش میگردید اصلاً چیزه دیگری باشد.

میخوام زمانی که کاربر تغییراتی در سلول های مختلف مانند اضافه کردن رکورد و یا حذف اون و یا تغییراتی انجام داد اما هنوز ذخیره نکرده بتونه مثلا یکی دو تغییر آخر رو آندو کنه

Mojtaba.Kh
پنج شنبه 07 آبان 1388, 11:29 صبح
بهتر است از پایگاه داده خود بک آپ بگیرید و برای آندو کردن دوباره از آن پایگاه داده استفاده کنید.

اونوقت اگر مثلا دیتابیسم خیلی بزرگ بود چی؟

Mojtaba.Kh
دوشنبه 11 آبان 1388, 08:57 صبح
کسی نیست که مرا یاری کند؟

اَرژنگ
دوشنبه 11 آبان 1388, 09:11 صبح
کسی نیست که مرا یاری کند؟
اینکار مقداری پژوهش لازم دارد،
تا این حد کنترل بر عملیات در این حالت کم پیش میاد، معمولا برایه انجام عملیات از حد "انجام" و یا "انصراف" بیشتر استفاده نمیشه (من جایی ندیدم، اگر کسی جایی سراغ دارد لطفاً به ما هم بگه).
ولی روش پیاده کردنش این است که زمانی که مقدار یک فیلد عوض میشه در یک استک نام فیلد و شماره سطر و مقدار قبلی نگهداری بشه، به این شکل میشه عملیات را جلو عقب برد.
در چه موردی تا این حد به این نوع داشتن کنترل احتیاج دارید؟ اگرچه شدن است ولی یکمی وقت میخواهد (نه فقط برایه پیاده کردن بلکه برایه تست شدنش).

seven7777777
دوشنبه 11 آبان 1388, 12:27 عصر
ولی روش پیاده کردنش این است که زمانی که مقدار یک فیلد عوض میشه در یک استک نام فیلد و شماره سطر و مقدار قبلی نگهداری بشه، به این شکل میشه عملیات را جلو عقب برد.

خوب اگه طرف یه ردیف رو پاک کرد چی ؟
ببین دوست خوبم
یه روش ساده که به ذهن من می رسه اینه که یه جدول شبیه جدول اصلیت درست کنی با عنوان مثلا Temp .
بعد بیایی و هر ردیف که در گریدت تغییر کرد ، در این جدول وارد کنی البته با ذکر نوع تغییر مثلا ردیف 3 ستون نام تغییر کرد . حالا اصل این ردیف رو تو جدول Temp وارد می کنی و نوع تغییر رو ویرایش می ذاری . بعد هم جدول اصلیت رو تغییر میدی .
حالا اگه طرف برگشت زد به راحتی از این جدول کمک می گیری . برای مثل حذف یک ردیف اول ردیف رو وارد جدول Temp می کنی و نوع تغییر رو حذف می ذاری بعد از جدول اصلیت حذفش می کنی .

البته برای همین حالات ساده یکسری موارد و مشکلات همین الان به ذهن من می رسه که گفتنش از حوصله بحث خارجه . اگه مشکلی بود بگو تا توضیح بدم .

اَرژنگ
دوشنبه 11 آبان 1388, 12:58 عصر
خوب اگه طرف یه ردیف رو پاک کرد چی ؟

در استک عملیات نگهداری میشه

یه روش ساده که به ذهن من می رسه اینه که یه جدول شبیه جدول اصلیت درست کنی با عنوان مثلا Temp .
بعد بیایی و هر ردیف که در گریدت تغییر کرد ، در این جدول وارد کنی البته با ذکر نوع تغییر مثلا ردیف 3 ستون نام تغییر کرد . حالا اصل این ردیف رو تو جدول Temp وارد می کنی و نوع تغییر رو ویرایش می ذاری . بعد هم جدول اصلیت رو تغییر میدی .
حالا اگه طرف برگشت زد به راحتی از این جدول کمک می گیری . برای مثل حذف یک ردیف اول ردیف رو وارد جدول Temp می کنی و نوع تغییر رو حذف می ذاری بعد از جدول اصلیت حذفش می کنی .

البته برای همین حالات ساده یکسری موارد و مشکلات همین الان به ذهن من می رسه که گفتنش از حوصله بحث خارجه . اگه مشکلی بود بگو تا توضیح بدم .
اشکالات این روش این است که به نظر ساده میاد ولی بیشتر اشکالات بوجود میاره تا حل میکنه، روش اصولی اینکار استفاده از Command Pattern است، و معمولا با یک استک که عملیات را نگهداری میکنه.
روشهایه اصولی از Design Pattern ها استفاده میکنند، هر روش به نظر ساده‌ای که به فکر بیاد را که نمیشه همینطوری بدانه پژوهش و گفتن اشکالاتش از اول پیشنهاد داد.

Crestfallen
دوشنبه 11 آبان 1388, 17:38 عصر
به نظرم گرید رو با کلاس بایند کن
به ازا هر تغییر یه object جدید بساز و آبجکتها رو درون ارایه نگه دار .

حالا با undo کردن کاربر آخرین objec رو بایند کن.

esmartiz_red
سه شنبه 12 آبان 1388, 00:41 صبح
دوست عزیز روی بانک اطلاعاتی منم تا حالا ندیدم همچین عملی انجام بدن بهتره تمام کارایی که می خوای انجام بدی قبل از ذخیره و یا تغیرات روی بانک باشه مثلا ابتدا داده رو به datagridview اضافه کنی یا از اون کم کنی و در آخر تغییرات رو روی بانک اعمال کنی که اگر طرف پشیمون شد و خواست undo یا redo انجام بده اصال اطلاعات تغییری نکنه

Mojtaba.Kh
چهارشنبه 13 آبان 1388, 08:33 صبح
اول اینکه ممنونم از دوستان
روشهایی که ارائه دادید عالی بود

ابتدا داده رو به datagridview اضافه کنی یا از اون کم کنی و در آخر تغییرات رو روی بانک اعمال کنی که اگر طرف پشیمون شد و خواست undo یا redo انجام بده اصال اطلاعات تغییری نکنه
همیشه همین کارو می کنم اما در این حالت اگه چند عمل رو انجام بده مثلا یکی از سطر ها حذف بشه ویکی اضافه بشه اونوقت باید کاربر از همه تغییرات انصراف بده

به نظرم گرید رو با کلاس بایند کن
به ازا هر تغییر یه object جدید بساز و آبجکتها رو درون ارایه نگه دار .

حالا با undo کردن کاربر آخرین objec رو بایند کن.
جدول مورد نظر رکوردهای زیادی داره

اما روش استفاده از جدول کمکی میتونه جوابگو باشه مشکلاتشو بگی ممنون میشم.

آرژنگ عزیر میشه بگید چطور از Command Pattern باید استفاده کرد؟

اَرژنگ
چهارشنبه 13 آبان 1388, 08:48 صبح
اول اینکه ممنونم از دوستان
روشهایی که ارائه دادید عالی بود

همیشه همین کارو می کنم اما در این حالت اگه چند عمل رو انجام بده مثلا یکی از سطر ها حذف بشه ویکی اضافه بشه اونوقت باید کاربر از همه تغییرات انصراف بده

جدول مورد نظر رکوردهای زیادی داره

اما روش استفاده از جدول کمکی میتونه جوابگو باشه مشکلاتشو بگی ممنون میشم.

آرژنگ عزیر میشه بگید چطور از Command Pattern باید استفاده کرد؟

روش اینطوریه که همینطوری مقادیر عوض ، دیلیت و یا اضافه نمیشند، هر برایه تغییر دادن، دیلیت و یا هر کاری که قبلاً بدانه مدیریت همینطوری انجام میشد ، برایه هر کدام از تغییر دادن، دیلیت کردن، ... یک چیز (شئی) دستور وجود دارد. به این شکل وقتی که یک مثلاً یک مقدار بخواد عوض بشه، مقدار موجود را نگهداری میکنه، دستور عوض شدن مقدار و مقدار جدید در یک لیست، و یا استک نگهداری میشه. به این شکل میشه بر عکس دستور انجام شده را پیدا کرد و از یک استیت به استیت قبلی و یا بعدی برگرداند.

esmartiz_red
چهارشنبه 13 آبان 1388, 15:32 عصر
خوب شما باید یک history از اعمالی که انجام می دی ایجاد کنی و مشخصات هر عمل رو ذخیره کنی و به هر کدوم یک شماره بدی
در ضمن شما نمی تونی هنمه اعمال رو ذخیره کنی در برنامه های دیگه هم می بینیم که undo چهار 5 مرحله بیشتر به عقب بر نمی گرده

azadehsr
شنبه 16 آبان 1388, 10:01 صبح
می تونی از trigger استفاده کنی

saeeedft
شنبه 16 آبان 1388, 22:22 عصر
می تونی از trigger استفاده کنی
منم با نظر دوستمون موافقم

Mojtaba.Kh
سه شنبه 19 آبان 1388, 12:39 عصر
می تونی از trigger استفاده کنی


چطور میتونم اینکارو بکنم؟

saed2006
سه شنبه 19 آبان 1388, 13:53 عصر
بهترین راه فکر میکنم استفاده از پشته هست خیلی هم راحت میشه این کار رو کرد
و حداقل حافظه رو اشغال میکنه با توجه به روشهای دیگه که ÷یشنهاد دادند
هزینه سبکتری دارد

saed2006
سه شنبه 19 آبان 1388, 13:58 عصر
بدترین کار اعمال این تغیرات مستقیما روی دیتا بیس هست که هزینه بر تر از بقیه هست و فکر میکنم اصولی هم نباشه

razavi_university
چهارشنبه 20 آبان 1388, 08:37 صبح
با یک روش ساده میتونین استفاده کنید :
برای فرمتون در کنار دیتاگرید ۲ دکمه تایید و انصراف بگذارید و در کدتون هم یک جدول را به یک جدول در دیتابیس بایند کنید.
هر تغیر و ورود و حذف را در datatable انجام دهید و پس از دکمه تایید جدول دیتابیس را بهنگام کنید

با این روش نمیتونین مرحله مرحله به عقب و جلو بروید ولی مزیتش اینه که اگر کاربر اشتباها داده هایی را حذف کرد و یا تغییر داد( کاربردر حین درج و حذف تمامی تغییراتی را که انجام می دهد در دیتاگرید فرم می بیند) تا زمانی که دکمه تایید زده نشده هیچ تغییری در دیتابیس انجام نمی شود