Primefaces dataTable在rowEdit之后排序

时间:2014-11-29 12:43:33

标签: sorting primefaces datatable

我有点陷入PrimeFaces dataTable部分。我用rowEditor和sortBy内置方法创建了一个表,但是当我修改表中的一行时,条目的顺序没有更新。

从理论上讲,它应该有效:update=":form:fruits"。但它不会更新修改后的行。所以我尝试更新整个表单:update=":form"。但在这种情况下,我从表中删除了所有数据,除了更新的数据,没有任何设计。

ScreenShot01 ScreenShot02

这是一个非常简短的示例代码来重现问题。

Fruit.java:

public class Fruit {

    private Integer id;
    private String name;

    public Fruit(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Fruit)) {
            return false;
        }
        return id == ((Fruit) o).getId();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Fruits.java:

@ManagedBean(name = "fruits")
@ViewScoped
public class Fruits implements Serializable {

    private static final long serialVersionUID = 1L;

    private ArrayList<Fruit> list = new ArrayList<Fruit>() {
        {
            add(new Fruit(1, "apple"));
            add(new Fruit(2, "orange"));
            add(new Fruit(3, "banana"));
            add(new Fruit(4, "pineapple"));
            add(new Fruit(5, "cocoa"));
        }
    };

    public void onRowEdit(RowEditEvent event) {
        Fruit fruit = (Fruit) event.getObject();
        list.set(list.indexOf(fruit), fruit);
    }

    public ArrayList<Fruit> getList() {
        return list;
    }

    public void setList(ArrayList<Fruit> list) {
        this.list = list;
    }
}

fruits.xhtml:

<h:head />

<h:body>
    <h:form id="form">
        <p:dataTable id="fruits" value="#{fruits.list}" var="fruit"
            editable="true" sortBy="#{fruit.name}">
            <p:ajax event="rowEdit" listener="#{fruits.onRowEdit}" update=":form"></p:ajax>
            <p:column headerText="Name" sortBy="#{fruit.name}">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{fruit.name}" />
                    </f:facet>
                    <f:facet name="input">
                        <h:inputText value="#{fruit.name}" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column>
                <p:rowEditor />
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

我有什么想法可以解决问题吗?

4 个答案:

答案 0 :(得分:0)

尝试使用@form而不是:form 使用:形式:水果是正确的形式我不知道为什么它不与你合作。

答案 1 :(得分:0)

我已经尝试了所有可能的关键字(@ this,@ form,@ all),但这些都没有帮助。
今天我在表单末尾添加了一个Refresh按钮。使用此按钮,我可以按预期刷新表。但我并不是真的不安,为什么update=":form"不适用于事件&#34; rowEdit&#34;。

<p:commandButton value="Refresh">
    <p:ajax update=":form"></p:ajax>
</p:commandButton>

答案 2 :(得分:0)

今天我遇到了同样的问题并找到了解决方法: 创建一个remoteCommand,它更新表并在cellEdit ajax事件之后将此remoteCommand称为oncomplete操作。

段:

<h:form id="form">
    <p:remoteCommand name="remoteCmd" update="table" />

    <p:dataTable id="table" ...>

        <p:ajax event="cellEdit" listener="#{anyClass.onCellEdit}"
            oncomplete="remoteCmd();" />

        <p:column headerText="header">
            values
        </p:column>
    </p:dataTable>
</h:form>

答案 3 :(得分:0)

我在PF 6.1中遇到相同或类似的问题。如果我没有通过单击可排序的标题对数据表进行排序,我可以编辑一个单元格(我使用单元格编辑,而不是行编辑),一切都很好。如果我在任何可排序的标题上对表进行排序然后编辑单元格,则模型数据不会被破坏,但是已编辑的单元格会在表格中显示其上方或下方看似随机的单元格的值,就好像它正在显示该值一样如果表没有排序,那么单元格就会有。行中的其他单元格都很好。如果我在单元格中单击以重新编辑它,则输入元素中显示的值是正确的;如果我然后将焦点移出单元格,则会再次出现不正确的值。如果我然后刷新页面或进行其他排序,则表中显示的值是正确的。

我遇到过模型数据已损坏但我现在无法重现的情况。

我使用RemoteCommand尝试了Gregor的解决方法,没有任何改变。

我还有一个&#34;刷新&#34;按钮确实可以解决问题,但用户并不直观地将其用于此目的。

我知道这不是一个答案,但它可以帮助有人解决同样的问题。只需添加到知识库中。