这就是场景:我正在使用需要分组的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);
}
}
答案 0 :(得分:1)
我遇到过类似的问题。免责声明:如果您在分组时未显示“分组数据”消息,则以下解决方案可能无效。
在我的情况下,由于弹出“分组数据”,分组列的分类被搞砸了。 让我澄清一下。
当尝试对显示超过50条记录的ListGrid进行分组时,会出现“分组数据”弹出窗口。
出现这种情况是因为ListGrid在内部异步进行分组操作,以避免来自浏览器的“脚本运行缓慢”消息。
我所做的是将grouping async threshold设置为更高的值。这样做的风险是让“脚本运行缓慢”的浏览器消息,即使这可能只发生在IE8 / 9上。
最后,在网格构造函数中,只需添加(我使用500作为阈值):
setInitialSort(new SortSpecifier[] {new SortSpecifier("user", SortDirection.ASCENDING)}));
setGroupByField("access");
setGroupByAsyncThreshold(500);
同时设置initial sort和grouped 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)方法按多个字段进行分组。