在我的JSF应用程序中,我使用了一个rich:dataTable,如下所示:
<rich:dataTable id="itemTable" value="#{backingBean.itemsList}" var="i" >
<rich:column> <f:facet name="header">ItemValue</f:facet>
<h:inputText id="myId" value="#{i.value}" style="width: 30px" />
</rich:column> </rich:dataTable>
<h:commandButton id="saveB" value="Save" action="#{backingBean.doSave()}" />
doSave的Bean代码:
public String doSave() {
Iterator<Item> = itemsList.iterator();
while(iter.hasNext()) {
//do something
}
}
在doSave() - Method中,我需要知道当前Item的行索引,有没有办法实现这个?
答案 0 :(得分:0)
虽然Richfaces扩展数据表支持selection management,但Richfaces数据表却不支持。
我发现从列表中检索某种选择项的最简单方法是向每行添加一个图标。为此,将命令按钮放入数据表本身:
<rich:dataTable id="itemTable" value="#{backingBean.itemsList}" var="i" >
<rich:column>
<h:inputText id="myId" value="#{i.value}" />
<h:commandButton id="saveB" action="#{backingBean.doSave}" />
</rich:column>
</rich:dataTable>
在bean代码中,提供方法doSave
,但附加参数'ActionEvent'
public String doSave(ActionEvent ev) {
Item selectedItem = null;
UIDataTable objHtmlDataTable = retrieveDataTable((UIComponent)ev.getSource());
if (objHtmlDataTable != null) {
selectedItem = (Item) objHtmlDataTable.getRowData();
}
}
private static UIDataTable retrieveDataTable(UIComponent component) {
if (component instanceof UIDataTable) {return (UIDataTable) component;}
if (component.getParent() == null) {return null;}
return retrieveDataTable(component.getParent());
}
您看,ActionEvent ev
为您提供了源元素(UIComponent)ev.getSource()
。遍历它直到您点击UIDataTable
元素并使用它的行数据。
可能的方法是使用函数调用将元素作为参数:
<rich:dataTable id="itemTable" value="#{backingBean.itemsList}" var="i" >
<rich:column>
<h:inputText id="myId" value="#{i.value}" />
<h:commandButton id="saveB" action="#{backingBean.doSave(i)}" />
</rich:column>
</rich:dataTable>
并在bean中
public String doSave(Item item) {
// do stuff
}
那不是那么干净,但也应该和EL合作。希望,它有所帮助...