توضیح مساله:
در برنامههای ADF پس از آن که عملیات rollback انجام میگیرد تمام اطلاعات refresh می شوند و ردیف جاری به اولین رکورد view باز می گردد. حال شرایطی را درنظر بگیرید که کاربر ردیفی را انتخاب کرده است و در این لحظه نیاز به ایجاد رکوردی جدید می باشد و با زدن دکمه ایجاد رکورد خالی را ایجاد می نماید اما پس از آن منصرف می شود و دکمه انصراف را می فشارد و در اینجا نیاز به انجام عملیات rollback می باشد تا رکورد جدید خالی حذف گردد. پس از عملیات rollback کاربر به ردیف قبل از عملیات ایجاد باز نخواهد گشت و اولین رکورد view به عنوان ردیف جاری انتخاب خواهد شد و کاربر مجبور خواهد بود تا دوباره ردیف مورد نظر را جستجو و انتخاب نمایید. این موضوع از دیدگاه کاربر بسیار وحشتناک می باشد و قصد دارم در ادامه روشی را بیان کنم که کاربر را به ردیف قبلی خود باز گرداند.
توضیح راه حل:
در ابتدا باید قبل از انجام هر عملیات ردیف جاری را در scope مناست ذخیره نماییم. در صورتی که تمام عملیات شما در یک صفحه انجام می شود از viewScope استفاده نمایید که من فرض را بر این حالت قرار داده ام. در backing bean خود فیلد و متد زیر را تعریف نمایید
final String OLD_CURR_KEY_VIEWSCOPE_ATTR = "__oldCurrentRowKey__";<br />
public BindingContainer getBindings() {<br />
return BindingContext.getCurrent().getCurrentBindingsEntry();<br />
}
برای ذخیره ردیف جاری متد زیر را اجرا نمایید.
public void saveCurrentRow() {<br />
BindingContainer bindings = getBindings();<br />
DCIteratorBinding dciter =<br />
(DCIteratorBinding)bindings.get("Your view iterator name");<br />
if (dciter != null) {<br />
Row oldCcurrentRow = dciter.getCurrentRow();<br />
ADFContext adfCtx = ADFContext.getCurrent();<br />
adfCtx.getScope("pageFlowScope").put(OLD_CURR_KEY_VIEWSCOPE_ATTR,<br />
oldCcurrentRow.getKey().toStringFormat(true));<br />
}<br />
}
حال ردیف جاری در pageFlowScope ذخیره شده است و می توانید عملیات rollback را انجام دهید و پس از آن متد زیر را اجرا نمایید تا ردیف قبلی را بازیابی و به عنوان ردیف جاری انتخاب
public void restoreCurrentRow() {<br />
BindingContainer bindings = getBindings();<br />
DCIteratorBinding dciter = (DCIteratorBinding) bindings.get("Your view iterator name");<br />
ADFContext adfCtx = ADFContext.getCurrent();<br />
String oldCurrentRowKey = (String) adfCtx.getViewScope().get(OLD_CURR_KEY_VIEWSCOPE_ATTR);<br />
if ( oldCurrentRowKey != null){<br />
dciter.setCurrentRowWithKey(oldCurrentRowKey);<br />
FacesContext fctx = FacesContext.getCurrentInstance();<br />
fctx.renderResponse();<br />
}</p>
<p>}
فایل ضمیمه شده مثال کامل می باشد.
فایل پیوست:
داانلود