当列是动态的并且显示为地图列表时,我遇到了进行即时选择的问题:
private List<Map<String,DataWindowField>> columns;它是如何工作的:我有一个从ViewedScoped bean调用的类:
public class DataWindow extends Utility { private static final long serialVersionUID = 1L; private TransactionObject transObject; public Main main; private String sqlStatement; private List<Map<String,DataWindowField>> columns; private List<DataWindowHeader> headers; public List<Map<String,DataWindowField>> getColumns() { return columns; } public void setColumns(List<Map<String,DataWindowField>> columns) { this.columns = columns; } public List<DataWindowHeader> getHeaders() { return headers; } public List<DataWindowHeader> getVisibleHeaders() { List<DataWindowHeader> visibleHeaders=new ArrayList<DataWindowHeader>(); for(DataWindowHeader header:headers) { if(header.isVisible()==true) { visibleHeaders.add(header); } } return visibleHeaders; } public void setHeaders(List<DataWindowHeader> headers) { this.headers = headers; } }这个类的Xhtml文件如下所示:
<p:dataTable id="dw_favorites_detail" var="column" value="#{dw.columns}" scrollable="false"> <p:columns var="column_header" value="#{dw.getVisibleHeaders()}"> #{column[column_header.dbAlias].value} </p:columns> </p:dataTable>我需要这样的结构,因为在执行期间可以改变整个列的可见性。
我的问题是如何为这些行创建DataModel以进行即时选择?
我当前的模型还没有完成,因为我不知道如何将所选行与Map对应:
public class DataWindowRowModel extends ListDataModel<Map<String,DataWindowColumn>> implements SelectableDataModel<Map<String,DataWindowColumn>> { @Override public Map<String,DataWindowColumn> getRowData(String arg0) { List<Map<String,DataWindowColumn>> columns=(List<Map<String,DataWindowColumn>>) getWrappedData(); for(Map<String,DataWindowColumn> column:columns) { } return null; } @Override public Object getRowKey(Map<String,DataWindowColumn> rowdata) { return rowdata; } }提前致谢。
I have the problem with making Instant Selection when columns is dynamic and presented as List of Maps:
private List<Map<String,DataWindowField>> columns;How it works now: I have a class that called from ViewedScoped bean:
public class DataWindow extends Utility { private static final long serialVersionUID = 1L; private TransactionObject transObject; public Main main; private String sqlStatement; private List<Map<String,DataWindowField>> columns; private List<DataWindowHeader> headers; public List<Map<String,DataWindowField>> getColumns() { return columns; } public void setColumns(List<Map<String,DataWindowField>> columns) { this.columns = columns; } public List<DataWindowHeader> getHeaders() { return headers; } public List<DataWindowHeader> getVisibleHeaders() { List<DataWindowHeader> visibleHeaders=new ArrayList<DataWindowHeader>(); for(DataWindowHeader header:headers) { if(header.isVisible()==true) { visibleHeaders.add(header); } } return visibleHeaders; } public void setHeaders(List<DataWindowHeader> headers) { this.headers = headers; } }Xhtml file for this class is looks like here:
<p:dataTable id="dw_favorites_detail" var="column" value="#{dw.columns}" scrollable="false"> <p:columns var="column_header" value="#{dw.getVisibleHeaders()}"> #{column[column_header.dbAlias].value} </p:columns> </p:dataTable>I need such construction because visibility of the entire column can be changed during execution.
And my question is How to create DataModel for such rows to make Instant selection?
My current model is not finished because I don't know how to correspond selected row with Map:
public class DataWindowRowModel extends ListDataModel<Map<String,DataWindowColumn>> implements SelectableDataModel<Map<String,DataWindowColumn>> { @Override public Map<String,DataWindowColumn> getRowData(String arg0) { List<Map<String,DataWindowColumn>> columns=(List<Map<String,DataWindowColumn>>) getWrappedData(); for(Map<String,DataWindowColumn> column:columns) { } return null; } @Override public Object getRowKey(Map<String,DataWindowColumn> rowdata) { return rowdata; } }Thanks in advance.
最满意答案
我已经通过下一个方式纠正了这个问题并且它选择了列:
public class DataWindowRowModel extends ListDataModel<Map<String,DataWindowField>> implements SelectableDataModel<Map<String,DataWindowField>> { public DataWindowRowModel() { } public DataWindowRowModel(List<Map<String,DataWindowField>> columns) { super(columns); } @Override public Map<String,DataWindowField> getRowData(String rowKey) { Map<String,DataWindowField> currentRowMap=new HashMap<String,DataWindowField>(); List<Map<String,DataWindowField>> row=(List<Map<String,DataWindowField>>) getWrappedData(); for(Map<String,DataWindowField> column:row) { for(DataWindowField value:column.values()) { if(value.getValue().equals(rowKey)); return column; } } return null; } @Override public Object getRowKey(Map<String,DataWindowField> rowdata) { for(DataWindowField value:rowdata.values()) { return value.getValue(); } return null; }}
和xhtml文件:
<p:dataTable id="dw_favorites_detail" var="column" value="#{dw.rowModel}" selection="#{dw.row}" scrollable="false" selectionMode="single"> <p:ajax event="rowSelect" listener="#{dw.onRowSelect}"/> <p:columns var="column_header" value="#{dw.getVisibleHeaders()}" width="20%"> #{column[column_header.dbAlias].value} </p:columns> </p:dataTable>I have corrected this in next way and it select columns well:
public class DataWindowRowModel extends ListDataModel<Map<String,DataWindowField>> implements SelectableDataModel<Map<String,DataWindowField>> { public DataWindowRowModel() { } public DataWindowRowModel(List<Map<String,DataWindowField>> columns) { super(columns); } @Override public Map<String,DataWindowField> getRowData(String rowKey) { Map<String,DataWindowField> currentRowMap=new HashMap<String,DataWindowField>(); List<Map<String,DataWindowField>> row=(List<Map<String,DataWindowField>>) getWrappedData(); for(Map<String,DataWindowField> column:row) { for(DataWindowField value:column.values()) { if(value.getValue().equals(rowKey)); return column; } } return null; } @Override public Object getRowKey(Map<String,DataWindowField> rowdata) { for(DataWindowField value:rowdata.values()) { return value.getValue(); } return null; }}
And xhtml file:
<p:dataTable id="dw_favorites_detail" var="column" value="#{dw.rowModel}" selection="#{dw.row}" scrollable="false" selectionMode="single"> <p:ajax event="rowSelect" listener="#{dw.onRowSelect}"/> <p:columns var="column_header" value="#{dw.getVisibleHeaders()}" width="20%"> #{column[column_header.dbAlias].value} </p:columns> </p:dataTable>更多推荐
发布评论