如何在分组ListGrid中对记录(带代码)进行排序?

时间:2013-08-13 19:42:17

标签: smartgwt

这就是场景:我正在使用需要分组的listgrid,并且还需要在每个组中对其记录进行排序。我已经使用了ListGrid.sort()ListGrid.sort(String, SortDirection)方法,但它们都没有正常工作。

当网格未分组时,此问题不会显示(它使排序完美);当通过单击列标题进行排序(将listgrid分组)时,工作正常,但我需要按代码对其进行排序(无需用户交互),因为需要禁用标题排序选项(以及上下文菜单)。

我正在使用SmartGWT 4.0

这是我正在使用的课程:

public class Access extends ListGrid {

    public Access() {
        super();
        setWidth("30%");
        setHeight100();
        // setShowHeaderContextMenu(false);
        setCanResizeFields(false);
        // setCanSort(false);
        setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
        setWrapCells(true);
        setFixedRecordHeights(false);
        setShowRecordComponents(true);
        setShowRecordComponentsByCell(true);

        ListGridField id = new ListGridField("id", "ID");
        ListGridField user = new ListGridField("user", "User");
        ListGridField access = new ListGridField("access", "Access");

        id.setHidden(true);
        user.setWidth("60%");
        access.setWidth("40%");

        access.setType(ListGridFieldType.BOOLEAN);
        access.setCanEdit(true);

        setFields(id, user, access);

        groupBy("access");
        access.setGroupTitleRenderer(new GroupTitleRenderer() {
            public String getGroupTitle(Object groupValue, GroupNode groupNode, ListGridField field, String fieldName,
                    ListGrid grid) {
                return (String) groupValue + " - " + groupNode.getGroupMembers().length;
            }
        });
        getField("access").setGroupValueFunction(new GroupValueFunction() {
            public Object getGroupValue(Object value, ListGridRecord record, ListGridField field, String fieldName,
                    ListGrid grid) {
                Boolean access = (Boolean) value;
                if (access)
                    return "With access";
                else
                    return "Without access";
            }
        });

        ListGridRecord lgr1 = new ListGridRecord();
        lgr1.setAttribute("id", 1);
        lgr1.setAttribute("user", "ewgzx");
        lgr1.setAttribute("access", true);

        ListGridRecord lgr2 = new ListGridRecord();
        lgr2.setAttribute("id", 2);
        lgr2.setAttribute("user", "Bgfths");
        lgr2.setAttribute("access", false);

        ListGridRecord lgr3 = new ListGridRecord();
        lgr3.setAttribute("id", 3);
        lgr3.setAttribute("user", "utcvs");
        lgr3.setAttribute("access", true);

        ListGridRecord lgr4 = new ListGridRecord();
        lgr4.setAttribute("id", 4);
        lgr4.setAttribute("user", "gfdjxc");
        lgr4.setAttribute("access", false);

        ListGridRecord lgr5 = new ListGridRecord();
        lgr5.setAttribute("id", 5);
        lgr5.setAttribute("user", "763");
        lgr5.setAttribute("access", true);

        ListGridRecord lgr6 = new ListGridRecord();
        lgr6.setAttribute("id", 6);
        lgr6.setAttribute("user", "2");
        lgr6.setAttribute("access", false);

        ListGridRecord lgr7 = new ListGridRecord();
        lgr7.setAttribute("id", 7);
        lgr7.setAttribute("user", "35");
        lgr7.setAttribute("access", false);

        ListGridRecord lgr8 = new ListGridRecord();
        lgr8.setAttribute("id", 8);
        lgr8.setAttribute("user", "123");
        lgr8.setAttribute("access", true);

        ListGridRecord lgr9 = new ListGridRecord();
        lgr9.setAttribute("id", 9);
        lgr9.setAttribute("user", "2342");
        lgr9.setAttribute("access", true);

        ListGridRecord lgr10 = new ListGridRecord();
        lgr10.setAttribute("id", 10);
        lgr10.setAttribute("user", "aqwc");
        lgr10.setAttribute("access", false);

        setRecords(new ListGridRecord[] { lgr1, lgr2, lgr3, lgr4, lgr5, lgr6, lgr7, lgr8, lgr9, lgr10 });

        sort("user", SortDirection.ASCENDING);
    }
}

2 个答案:

答案 0 :(得分:1)

我遇到过类似的问题。免责声明:如果您在分组时未显示“分组数据”消息,则以下解决方案可能无效。

在我的情况下,由于弹出“分组数据”,分组列的分类被搞砸了。 让我澄清一下。

当尝试对显示超过50条记录的ListGrid进行分组时,会出现“分组数据”弹出窗口。

出现这种情况是因为ListGrid在内部异步进行分组操作,以避免来自浏览器的“脚本运行缓慢”消息。

我所做的是将grouping async threshold设置为更高的值。这样做的风险是让“脚本运行缓慢”的浏览器消息,即使这可能只发生在IE8 / 9上。

最后,在网格构造函数中,只需添加(我使用500作为阈值):

setInitialSort(new SortSpecifier[] {new SortSpecifier("user", SortDirection.ASCENDING)}));
setGroupByField("access");
setGroupByAsyncThreshold(500);

同时设置initial sortgrouped column,如上所示。

程序化,第一次排序,然后是小组。

希望这有帮助。

答案 1 :(得分:0)

这是因为在渲染网格之前调用了sort(),而setRecords()使事情进一步复杂化。
当调用rootCanvas.draw()时(在onModuleLoad或类似的情况下),网格的初始渲染与其父节点一起发生。
由于setRecords()可用于随时更改网格中的数据集,因此无论是否处于初始阶段,它都会尝试重绘网格。

如果在真实场景中,在UI初始化之后触发排序,它应该如以下代码示例中给出的那样工作 删除构造函数末尾的sort()调用。

final Access access = new Access();

Button button = new Button("Sort");
button.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        // toggle sort direction, using two different ways to do it

        SortSpecifier sortSpecifier = access.getSortSpecifier("user");

        if (sortSpecifier == null || SortDirection.DESCENDING.equals(sortSpecifier.getSortDirection())) {
            access.sort("user", SortDirection.ASCENDING);
        } else {
            access.setSort(new SortSpecifier[]{
                    new SortSpecifier("user", SortDirection.DESCENDING)
            });
        }
    }
});

检查http://www.smartclient.com/smartgwt/showcase/#grid_multilevel_sort以了解如何使用listGrid.setInitialSort()。

在构造函数中使用setRecords()也可能导致其他初始化问题。

<强>更新
要使网格按负载分组并按负载排序,请按如下所示设置初始排序和分组。

// along with other configuration methods, can not use after grid is drawn
SortSpecifier sortSpecifier = new SortSpecifier("user", SortDirection.ASCENDING);
setInitialSort(new SortSpecifier[]{sortSpecifier});

// use following instead of groupBy(), which is used to group the grid programmatically
// groupBy() causes a redraw
setGroupByField("access");

可以使用重载的ListGrid.setGroupByField(String... field)方法按多个字段进行分组。