0

現在、フィルタリング用のテキストボックスとヘッダータイトルを含むデータグリッドのカスタムヘッダーを実装しています。テキストボックスをクリックすると、列がソートされ、フィルタリングできません。ソート部分を削除すると、フィルタリングは正常に機能します。フィルタリングとソートの両方を実行できるように、アイデアを提案してください。以下は私のサンプルコードです。(すべてが含まれているわけではありません。コードの関連部分のみを示しています)

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)???
4

1 に答える 1

0

onBrowserEvent をオーバーライドし、クリックのソースを特定する必要があります (それがテキスト入力であるかヘッダーであるか (正しく理解できれば、「並べ替え」ボタンの代わりに存在します)。アクションごとに 2 つの異なるクリック可能な要素があると仮定します)。 、 もちろん。

次のコード スニペットは、セルのコンテンツがクリックされたかどうか、またはクリックがコンテナー (セル自体) で発生したかどうかを判断するだけです。入力でクリックが発生した場合は、フィルタリングを行います。セルで発生した場合は、並べ替えを行います。

@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());
            }
        }
    }
}

onBrowserEvent のその他の例は、abstractCellページなどで見つけることができます。

于 2013-08-13T07:04:04.990 に答える