1

这是场景:我正在使用需要分组的列表网格,并且还需要在每个组中对其记录进行排序。我已经使用了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);
    }
}
4

2 回答 2

1

我一直有一个类似的问题。免责声明:如果分组时未出现“分组数据”消息,则以下解决方案可能无济于事。

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

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

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

我所做的是将分组异步阈值设置为更高的值。这样做的风险是得到“脚本运行缓慢”的浏览器消息,尽管这可能只发生在 IE8/9 上。

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

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

还要设置初始排序分组列,如上所示。

以编程方式,先排序,然后分组。

希望这可以帮助。

于 2014-01-30T21:50:11.667 回答
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)方法可用于按多个字段进行分组。

于 2013-08-14T06:24:57.187 回答