我在法国组织工作,我应该开发一个由六个连续屏幕组成的相当复杂的表格。我已经完成了五个屏幕,在最后的屏幕中,我遇到了一个特定的问题,有不同的解决方案。为了使我的.xhtml页面中的标记更具可读性,我更喜欢我们可以将新列添加到dataTable的一个特定行的解决方案。将通过单击commandButton来选择该行,该命令按钮将同时选择该行并添加新列。到目前为止,我可以向数据表添加一个新行,但问题是新添加的列将添加到我的dataTable的所有行中。我的问题很简单。是否可以将新列添加到用户选择的特定行中?如果有可能我会搜索找到答案,如果没有,我会按照其他已经考虑过的解决方案。当然,我非常感谢任何进一步的帮助,如提及任何参考书或网站。
答案 0 :(得分:0)
我们没有关于您的数据模型的任何信息,但我会尽力帮助您。
在#{data.optionalValues}上使用和循环使用嵌套循环或者甚至是另一个
<p:column>
<p:dataTable value=""><!-- Empty string as value forces 1 row. -->
<p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}">
#{opt.value}
</p:columns>
</p:dataTable>
使用此结构,您可以使用不同列的行。如果它可以正常工作,您只需要在之后更新数组内容。
但是如果您需要更多信息,可以看到以下链接: Primefaces static and dynamic columns in datatable
你不想做什么,但我希望它可以帮到你。
答案 1 :(得分:0)
我已经解决了我的问题。也许我遇到的问题不会经常引发,我发布解决方案并希望它可以帮助其他人面对像我这样的问题。
首先,我想要的是一个列,其中列是特定的表单字段。但这将是用户 谁决定是否要添加新的表单字段。如图所示,这就是我想要的:
为了做到这一点,我使用了primefaces <p:columns>
的可能性。但是由于这个标签在特定的支持bean的帮助下为dataTable的所有行添加了一个列,所以我已经彻底使用了<ui:repeat>
,因此休息的dataTable只有一行,如xhtml代码所示:
<ui:repeat var="thisQuadripole" value="#{saParametrageJbCoordinateurPrincipal.dataTableList.quadripoles}">
<h3>
<h:outputText value="#{thisQuadripole.quadripoleName}"></h:outputText>
</h3>
<ui:repeat var="thisMonoDatatable" value="#{thisQuadripole.monoDataTables}">
<h4>
<h:outputText value="#{thisMonoDatatable.directive}"></h:outputText>
</h4>
<p:dataTable value="" styleClass="normal" style="able-layout: fixed; width: 20px;" id="datatable">
<p:columns var="thisColumn" value="#{thisMonoDatatable.dataTableColumns}">
<f:facet name="header">
<h:outputText value="#{thisColumn.header}"></h:outputText>
</f:facet>
<h:selectOneMenu value="#{recherchesEcranBean.colonneTypeRechercheJb.sousColonne}">
<f:selectItems value="#{saParametrageJbCoordinateurPrincipal.toutTypeColonne}"></f:selectItems>
</h:selectOneMenu>
<p></p>
<p:outputLabel for="largeur2" value="(largeur)% "></p:outputLabel>
<p:inputText id="largeur2" value="#{recherchesEcranBean.colonneTypeRechercheJb.largeurAffichage}"
style="width: 40%;"></p:inputText>
</p:columns>
<p:column>
<f:facet name="header" style="width:10px;">
<h:outputText value=""></h:outputText>
</f:facet>
<h:commandButton id="thisButton"
action="#{saParametrageJbCoordinateurPrincipal.addNewColumnToMonoDataTable(thisMonoDatatable)}"
value=" + " style="background-color: #db70b8; cursor:pointer">
<f:ajax execute="@this" render="datatable"></f:ajax>
</h:commandButton>
</p:column>
</p:dataTable>
</ui:repeat>
</ui:repeat>
</h:form>
为了做到这一点,我使用了四个支持bean,正如我将要解释的那样,其中一个是我正在处理的项目强加给我的,但是其他三个是你需要使用的。第一个,我命名为DataTableList只包含一个名为Quadripole的另一个bean的列表(命名来自我在物理学中的背景):
@ManagedBean
@SessionScoped
public class DataTableList
{
@ManagedProperty(value="#{quadripoles}")
private List<Quadripole> quadripoles;
public List<Quadripole> getQuadripoles() {
if (quadripoles == null) {
quadripoles = new ArrayList<Quadripole>();
}
return quadripoles;
}
}
Quardripole实际上是一个bean,实际上包含四个数据表,我称之为MonoDataTable:*
@ManagedBean
@SessionScoped
public class Quadripole
{
@ManagedProperty(value="#{quadripoleName}")
private String quadripoleName;
@ManagedProperty(value="#{monoDataTables}")
private List<MonoDataTable> monoDataTables;
public Quadripole() {
//Emty contructor for managedBean
}
public Quadripole(String quadripoleName) {
this.quadripoleName = quadripoleName;
}
/**
* Accesseur de quadripoleName
*
* @return quadripoleName
*/
public String getQuadripoleName()
{
return quadripoleName;
}
/**
* Mutateur de quadripoleName
*
* @param quadripoleName quadripoleName
*/
public void setQuadripoleName(String quadripoleName)
{
this.quadripoleName = quadripoleName;
}
MonodataTable包含dataTableColumns列表:
@ManagedBean
@ViewScoped 公共类MonoDataTable实现了Serializable {
/**
* serialVersionUID - long, DOCUMENTEZ_MOI
*/
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{directive}")
private String directive;
@ManagedProperty(value="#{}")
private int columnCounter = 1;
@ManagedProperty(value="#{dataTableColumns}")
private List<DataTableColumn> dataTableColumns = new ArrayList<DataTableColumn>();
public MonoDataTable() {
//Empty constructor for managedBean
}
public MonoDataTable(String directive)
{
// DOCUMENTEZ_MOI Raccord de constructeur auto-généré
this.directive = directive;
}
/**
* Accesseur de directive
*
* @return directive
*/
public String getDirective()
{
return directive;
}
/**
* Mutateur de directive
*
* @param directive directive
*/
public void setDirective(String directive)
{
this.directive = directive;
}
/**
* Accesseur de columnCounter
*
* @return columnCounter
*/
public int getColumnCounter()
{
return columnCounter;
}
/**
* Mutateur de columnCounter
*
* @param columnCounter columnCounter
*/
public void setColumnCounter(int columnCounter)
{
this.columnCounter = columnCounter;
}
public List<DataTableColumn> getDataTableColumns() {
return dataTableColumns;
}
}
/**
* Accesseur de monoDataTables
*
* @return monoDataTables
*/
public List<MonoDataTable> getMonoDataTables()
{
if (monoDataTables == null ) {
monoDataTables = new ArrayList<MonoDataTable>();
}
return monoDataTables;
}
}
以这种方式借助于特定的函数:
public static void addMonoDataTablesToQuadripole(Quadripole quadripole) {
String directive = null;
directive = "Autre Structure ou National 0";
MonoDataTable newmonoDataTable = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable);
quadripole.getMonoDataTables().add(newmonoDataTable);
directive = "Direction 3";
MonoDataTable newmonoDataTable2 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable2);
quadripole.getMonoDataTables().add(newmonoDataTable2);
directive = "Direction 7";
MonoDataTable newmonoDataTable3 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable3);
quadripole.getMonoDataTables().add(newmonoDataTable3);
directive = "Direction 10";
MonoDataTable newmonoDataTable4 = new MonoDataTable(directive);
addFixedColumnsToMonoDataTable(newmonoDataTable4);
quadripole.getMonoDataTables().add(newmonoDataTable4);
}
/**
*
* DOCUMENTEZ_MOI
*
* @param monoDataTable
*/
public static void addFixedColumnsToMonoDataTable(MonoDataTable monoDataTable) {
int columnCounter = monoDataTable.getColumnCounter();
String header = columnHeader + columnCounter;
DataTableColumn newDataTableColumn = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn);
monoDataTable.setColumnCounter(++columnCounter);
columnCounter = monoDataTable.getColumnCounter();
header = columnHeader + columnCounter ;
DataTableColumn newDataTableColumn2 = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn2);
monoDataTable.setColumnCounter(++columnCounter);
}
/**
*
* DOCUMENTEZ_MOI
*
* @param monoDataTable
*/
public static void addNewColumnToMonoDataTable(MonoDataTable monoDataTable) {
int columnCounter = monoDataTable.getColumnCounter();
String header = columnHeader + columnCounter;
DataTableColumn newDataTableColumn = new DataTableColumn(header);
monoDataTable.getDataTableColumns().add(newDataTableColumn);
monoDataTable.setColumnCounter(++columnCounter);
}
每次用户点击“+”时,结果都会在收到点击的确切行中添加一列。也许这个解决方案不是太优雅,但它对我有用。我希望,至少,它不是太愚蠢。