目前,我已经为datagrid实现了一个自定义标头,其中包含一个用于过滤的文本框和一个标题标题。当我点击文本框时,该列排序,我无法过滤。如果我删除排序部分,过滤工作正常。请提出任何建议,以便完成过滤和排序。以下是我的示例代码。 (一切都不包括在内,只是我已经展示了相关的代码部分)
public class TextBoxHeader<T> extends Header<String> {
public TextBoxHeader(String title, String width) {
super(new TextInputCell());
this.title = title;
if (width != null) {
this.width = width;
}
}
@Override
public void render(Context context, SafeHtmlBuilder sb) {
if (value == null) {
value = "";
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<input type=\"text\" tabindex=\"-1\" value=\"" + value + "\" id=\"" + TEXT_BOX_ID
+ "\" style=\" width:130px");
//stringBuilder.append(width);
stringBuilder.append(" \" /> </input> <BR>");
stringBuilder.append(title);
sb.append(SafeHtmlUtils.fromSafeConstant(stringBuilder.toString()));
}
@Override
public void onBrowserEvent(Context context, Element elem, NativeEvent event) {
}
}
this sort event handler is in another class.
protected class DataGridSortEvent implements ColumnSortEvent.Handler {
@Override
public void onColumnSort(ColumnSortEvent event) {
System.out.println("inside DataGridSortEvent-->"+event.isSortAscending());
//customGrid.getDataProvider().refresh();
Collections.sort(customGrid.getDataProvider().getList(), nameComparator);
//customGrid.getDataProvider().refresh();
/*sortHandler.setComparator(name, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
System.out.println("inside comparator");
return o1.getName().compareTo(o2.getName());
}
});*/
}
}
Any ideas to handle both (Sort and filter)???
答案 0 :(得分:0)
你应该覆盖onBrowserEvent,识别点击的来源(无论是你的文字输入还是你的标题(如果我说得对,那就是那里而不是“排序”按钮)。我假设你有两个不同的可点击元素当然,对于每个动作。
以下代码片段只是确定单击了单元格的内容,或者单击是否发生在容器(单元格本身)上。如果输入上发生了点击,请进行过滤。如果它发生在单元格上,请进行排序。
@Override
public void onBrowserEvent(Context context, Element parent, T value, NativeEvent event, ValueUpdater<T> valueUpdater) {
// Handle the click event.
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if (CLICK.equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
Element eventElement = Element.as(eventTarget);
NodeList<Element> listOfChildrens = parent.getElementsByTagName("*");
for (int i = 0; i < listOfChildrens.getLength(); i++) {
Element currentElement = listOfChildrens.getItem(i);
if (currentElement.isOrHasChild(eventElement)) {
// text is always inside a Text node =
// element.childNodes[0].nodeValue.
execute(value, eventElement.getFirstChild().getNodeValue());
}
}
}
}
可以在abstractCell页面和其他页面上找到更多onBrowserEvent示例。