Technology: Oracle ADF Framework
با سلام.
همانطوری که می دانید در یک جدول af:table برای انتخاب سطر جاری component آماده ای با نام af:tableSelectOne
استفاده می کنیم که باید در facet ، selection قرار بگیرد.
گاهی در طراحیمان نیاز داریم که این کار توسط component دیگری مانند af:commandLink صورت یگیرد.

برای این کار باید مراحل زیر انجام شود:
1 - تبدیل component ستون دلخواه به af:commandLink:
برای این کار روی af:table تان در قسمت structure کلیک راست نموده و درcontext menu ظاهر شده گزینه ی properties را انتخاب کنید.
با انتخاب آن یک dialog با نام Table Properties ظاهر می گردد در Tab ، Column Summary ستون دلخواه را
انتخاب نموده و Component آن را به af:commandLink تغییر دهید.
2– اضافه کردن Action ، setCurrentRowWithKey برای Iterator مربوطه در PageDefiniton صفحه:
همان طور که می دانید هر ViewObject در Data Control Pallet یک سری Operation های آماده دارد که به آنها Built in Operations اطلاق می شود.
یکی از این Operation ها setCurrentRowWithKey می باشد.
این Action مخصوص عوض کردن سطر جاری با استفاده از RowKey ورودی می باشد . (توجه! اینکه این پارامتر ورودی خود Key سطر را نمی گیرد بلکه آن را به فرمت "stringified" شده ی آن می گیرد. در این موضوع در پایان این متن توضیح خواهم داد).
برای اضافه کردن این Action در PageDefinition تان در Element ، Bindings این Action را برای iterator دلخواهتان اضافه کنید . این Action یک پارامتر ورودی با نام rowKey دارد . Value این پارامتر را به EL Expression #{row.rowKeyStr} قرار دهید . این EL Expresion دقیقاًً به کلید جاری سطری که انتخاب خواهید کرد Bind است.

<action IterBinding="CreateFormIterator"
id="setCurrentRowWithKey"
InstanceName="AppModuleDataControl.CreateForm"
DataControl="AppModuleDataControl"
RequiresUpdateModel="false"
Action="96">
<NamedData NDName="rowKey" NDValue="#{row.rowKeyStr}"
NDType="java.lang.String"/>
</action>
3 – مرحله ی آخر قرار دادن Action Listener برای af:commandLink صفحه ی JSF :
af:commandLink ستونتان را انتخاب کنید و در Property Inspector آن Action ساخته شده را execute کنید .
#{bindings.setCurrentRowWithKey.execute}
به همین سادگی : به نتیجه ی کار نگاه کنید:
تفاوت setCurrentRowWithKey و setCurrentRowWithKeyValue :
تفاوت این دو Action در این است که setCurrentRowWithKey پارامتر ورودی rowKey یک کلید به صورت stringified شده می گیرد
Action setCurrentRowWithKeyValue پارامتر ورودی rowKey را به صورت مقدار اصلی کلید
می گیرد مثلاً اگر در مثال بالا " ID" ، فیلد keyAttribute ، View Object مان باشد باید به پارامتر این Action
مقدار NDValue="#{row.ID}" را پاس دهیم.
<action IterBinding="CreateFormIterator"
id="setCurrentRowWithKeyValue"
InstanceName="AppModuleDataControl.CreateForm"
DataControl="AppModuleDataControl"
RequiresUpdateModel="false"
Action="98">
<NamedData NDName="rowKey" NDValue="#{row.ID}"
NDType="java.lang.String"/>
</action>
محدودیت های setCurrentRowWithKeyValue :
فرض کنید View Object که داریم یک ViewObject ، Read only یا Programmatically باشد در این صورت به طور پیش فرض هیچ یک از فیلد هایمان به عنوان Key Attribute معرفی نشده اند . پس شما مجبور می شوید خودتان یکی از آنها را انتخاب کنید . همچنین باید View Object تان Row Key ها را Manage کند که برای این منظور باید متود create() را در کلاس Implementation ، override کرده و این خط کد را به آن اضافه کنید (زمانی که اولین بار
Application Module اجرا می شود متود create() تمامی View Object ها در ابتدا صدا زده می شود):
super.create();
setManageRowsByKey(true);
}
(View Object های entity Based به طور پیش فرض Row key ها را manage می کنند.)
حال یک سؤال دارم اگر چند فیلد به صورت Key Attribute معرفی شوند در پارامتر ورودی setCurrentRowWithKeyValue چه مقداری باید قرار گیرد ؟





0 comments:
Post a Comment