在将DataControl中的表格拖到页面上后,点击Delete按钮,总是删除第一行,也就是说获取不到当前行,为什么???
1. 首先,在拖拽生成ADF Table时,应设置成Single, 另外还有两个属性,selectedRowKeys="#{bindings.MbpTicket1.collectionModel.selectedRow}"
selectionListener="#{bindings.MbpTicket1.collectionModel.makeCurrent}"
2. 然后,如何还是不行的话,就可以不用自带的Operations下的Delete方法,而是自己添加删除数据库的方法,具体如下:
- 在Table手动添加一列Delete按钮
<af:column id="c20" headerText="Action">
<af:commandButton text="Delete" id="cb7"
actionListener="#{pageFlowScope.loginBean.deleteTicketById}">
<f:attribute value="#{row.TicketId}" name="TicketId" id="p1"/>
</af:commandButton>
</af:column>
- 并绑定到ManageBean中的相应方法(deleteTicketById)
- 在deleteTicketById中添加相应的方法
public void deleteTicketById(ActionEvent actionEvent) {
UIComponent component = actionEvent.getComponent();
Map map = component.getAttributes();
Object obj = map.get("TicketId");
AppModuleAMImpl am =
(AppModuleAMImpl)ADFUtils.getApplicationModuleForDataControl("AppModuleAMDataControl");
// delete the ticket
if (obj != null) {
Long ticketId = Long.parseLong(obj.toString());
System.out.println("====================" + ticketId);
am.deleteTicketById(ticketId);
}
}
- 在AM中添加ManageBean中调用的方法deleteTicketById
public void deleteTicketById(Long id)
{
DBTransaction dbTransaction = this.getDBTransaction();
String sql = "DELETE MBP_TICKET WHERE TICKET_ID = ? ";
PreparedStatement ps = dbTransaction.createPreparedStatement(sql, 0);
try {
ps.setLong(1, id);
ps.executeUpdate();
} catch (SQLException e) {
throw new JboException(e);
} finally {
if (ps != null) {
try{
ps.close();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
dbTransaction.commit();
this.getMbpTicket1().executeQuery();
}
- 这样就也可以达到点击表格一行,将此行删除的目的了。
注:前面我们说到ADF一般不直接在AM中操作数据库,而应该在ManageBean中操作VO,具体如下:
- 获得一个AM句柄
AppModuleAMImpl am =
(AppModuleAMImpl)ADFUtils.getApplicationModuleForDataControl("AppModuleAMDataControl");
- 获得VO
MbpTicketVOImpl vo = am.getMbpTicket1();
- 获取当前行的具体属性
Row row = vo.getCurrentRow()
MbpTicketVORowImpl ticketRow = (MbpTicketVORowImpl)row;
int movieId = ticketRow.getMovieId().intValue();