運作環境:JDeveloper 11.1.2.1.0 + Oracle Database 10g Express Edition 10.2.0.1。
實驗介紹:資料庫字段類型沒有Boolean類型,一般使用'Y'或’N'來表示true或false。
而Java資料類型有Boolean類型,是以儲存時需要把Boolean類型轉換為String類型,而顯示時要把String類型轉換為Boolean類型。
af:selectBooleanCheckbox元件可以自動轉換Boolean類型<->String類型,使用起來非常友善。
(1)首頁面
(2)全選IsPartTime,并Commit。
(3)檢視資料庫,發現IsPartTime字段值全部為'Y'。
(4)全不選IsPartTime,并Commit。
(3)檢視資料庫,發現IsPartTime字段值全部為'N'。
重要步驟說明:
1. 建立資料庫表:JOBS_CheckBox
在Jobs表的基礎上建立一個新表JOBS_CheckBox表,增加一個字段:IS_Parttime。
CREATE TABLE JOBS_CheckBox as select * from Jobs;
ALTER TABLE JOBS_CHECKBOX ADD (IS_Parttime VARCHAR2(1) );
ALTER TABLE JOBS_CHECKBOX ADD CONSTRAINT JOBS_CHECKBOX_PK PRIMARY KEY ( JOB_ID )ENABLE;
2. IsPartTime列頁面代碼
(1)從Data Control中拖放IsParttime到IsPartTime列,選擇生成“ADF Boolean CheckBox..."
CheckBox選中則指派‘Y’,沒選中指派'N':
(2)“全選和全不選”實作原理和《 Table 元件使用指南之三:一次删除Table多行記錄 》一樣,請參考其說明。
<af:column sortProperty="#{bindings.JobsCheckboxView1.hints.IsParttime.name}" filterable="true"
sortable="false" headerText="#{bindings.JobsCheckboxView1.hints.IsParttime.label}"
align="center" id="c5">
<f:facet name="header">
<af:selectBooleanCheckbox id="selectAllCheckBox" autoSubmit="true" label="IsPartTime">
<af:clientListener method="clickOnSelectAllCheckBox" type="valueChange"/>
<af:serverListener type="SelectAllCheckBoxClickEvent"
method="#{backingBeanScope.myBackingBean.handleSelectAllCheckboxClick}"/>
</af:selectBooleanCheckbox>
</f:facet>
<af:selectBooleanCheckbox value="#{row.bindings.IsParttime.inputValue}"
label="#{row.bindings.IsParttime.label}"
shortDesc="#{bindings.JobsCheckboxView1.hints.IsParttime.tooltip}"
id="sbc1" autoSubmit="true"/>
</af:column>
這裡有一個小問題,就是點選SelectAllCheckBox時,雖然我設定了autoSubmit="true",但是Commit/Rollback按鈕并沒有被Enable。
而點選每一行的CheckBox時,就可以Enable Commit/Rollback按鈕。
難道原因是因為SelectAllCheckBox隻是一個純頁面上的元件,沒有映射到模型層,對應到一個字段?待查。
3. Managed Bean的主要方法
public void handleSelectAllCheckboxClick(ClientEvent clientEvent) {
boolean isSelectAllChecked = (Boolean)clientEvent.getParameters().get("params");
RichTable rt = this.getJobsTable();
for (int i = 0; i < rt.getRowCount(); i++) {
JUCtrlHierNodeBinding rowData = (JUCtrlHierNodeBinding)rt.getRowData(i);
Row row = rowData.getRow();
if (isSelectAllChecked) {
row.setAttribute("IsParttime", "Y");
} else {
row.setAttribute("IsParttime", "N");
}
}
}