gpt4 book ai didi

jsf-2 - Primefaces 列切换器不适用于分页

转载 作者:行者123 更新时间:2023-12-02 09:54:15 26 4
gpt4 key购买 nike

我有一个数据表以及排序、过滤器和列切换器。首先,当我选择和取消选择同一页面中的列时,一切都很好。

enter image description here

enter image description here如您所见,我的第一列消失了

我的问题是,当我使用分页工具进入下一页时,如果我想取消选择某一列,它只会显示列标题,而不显示其行,如下所示: enter image description here现在显示了最初的隐藏列,但我们有一个间隙。最后一列现在为空,第一列将值传递到第二列。

这是我的数据表结构:

<p:dataTable id="datatable" var="mon" value="#{X.resultQuery}" 
first="#{dataTableController.first}"
resizableColumns="true"
rows="20"
paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="30,40,50"
draggableColumns="true"
paginatorPosition="bottom"
selectionMode="single" rowKey="#{mon[4]}"
>
<f:facet name="header">
<p:commandButton id="toggler" type="button" value="Hide Columns" icon="ui-icon-calculator" />
<p:columnToggler datasource="datatable" trigger="toggler">
<p:ajax event="toggle" listener="#{columnTogglerController.onToggle}" />
</p:columnToggler>
</f:facet>

这是我的 ColumnTogglerController :

public class ColumnTogglerController implements Serializable {

private List<Boolean> list;

/**
* Creates a new instance of ColumnTogglerController
*/
public ColumnTogglerController() {
}

public List<Boolean> getList() {
return list;
}

public void setList(List<Boolean> list) {
this.list = list;
}

@PostConstruct
public void init() {
setList(Arrays.asList(true, true, true, true, true, true, true, true, true, true, true));
}

public void onToggle(ToggleEvent e) {
list.set((Integer) e.getData(), e.getVisibility() == Visibility.VISIBLE);

}

}

基本上我的程序是基于这个博客的: http://blog.primefaces.org/?p=3341

感谢您的帮助。

最佳答案

我最近碰巧遇到了这个。 blog实际上有效。问题是 draggableColumns="true" 使列的索引发生变化。因此,我没有使用列表,而是使用了 2 张 map :

private final Map<String, Boolean> colVisibilityMap = new HashMap<>();
private final Map<Integer, String> colIndexMap = new HashMap<>();

在初始化期间,我设置了 colIndexMap 和 colVisibilityMap (并且我使用 id/clientId 作为键)。在列重新排序时,我更新 colIndexMap。在切换时,我根据 colIndexMap 更新 colVisibilityMap。

public Map<String, Boolean> getColVisibilityMap() {
return Collections.unmodifiableMap(colVisibilityMap);
}

private String getColumnId(String fullId) {
String[] idParts = fullId.split(":");
return idParts[idParts.length - 1];
}

@PostConstruct
public void init() {
FacesContext context = FacesContext.getCurrentInstance();
DataTable table = (DataTable) context.getViewRoot().findComponent(":form:tableid");
List<UIColumn> columns = table.getColumns();
for (int i = 0; i < columns.size(); i++) {
final String columnId = this.getColumnId(columns.get(i).getClientId());
colIndexMap.put(i, columnId);
colVisibilityMap.put(columnId, true);
});
}

public void onColumnReorder(AjaxBehaviorEvent e) {
List<UIColumn> columns = ((DataTable) e.getSource()).getColumns();
for (int i = 0; i < columns.size(); i++) {
this.colIndexMap.put(i, this.getColumnId(columns.get(i).getClientId()));
}
}

public void onToggle(ToggleEvent e) {
// If we use list here, e.getData() may not be the correct index due to column reordering.
this.colVisibilityMap.put(this.colIndexMap.get((Integer) e.getData()), e.getVisibility() == Visibility.VISIBLE);
}

这是我的 JSF 页面上的代码:

<p:dataTable id="tableid" widgetVar="tableWidgetVar" draggableColumns="true" paginator="true"
<!-- ommitted other attributes -->
>
<p:ajax event="colReorder" listener="#{bean.onColumnReorder}"/>
<f:facet name="header">
<p:commandButton id="toggler" type="button" value="Columns"/>
<p:columnToggler datasource="tableid" trigger="toggler">
<p:ajax event="toggle" listener="#{bean.onToggle}"/>
</p:columnToggler>
</f:facet>
<p:column id="col1" visible="#{bean.colVisibilityMap['col1']}">
<!-- ommitted -->
</p:column>
<p:column id="col2" visible="#{bean.colVisibilityMap['col2']}">
<!-- ommitted -->
</p:column>
<!-- and so on... -->
</p:dataTable>

关于jsf-2 - Primefaces 列切换器不适用于分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29817830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com