1

この列のデータを並べ替えるためにListHandlerも使用するDataGrid列で使用するGWTHeader <String>クラスのカスタム実装を作成しています。ユーザーがこのカスタムHeaderオブジェクトによってレンダリングされた特定の<INPUT>要素をクリックした場合に、「mousedown」イベントがDataGridのイベントハンドラーに戻るのを防ぐように、 HeaderクラスのBrowserイベントを処理およびキャンセルしようとしています。 (これにより、ListHandlerの列の並べ替えメソッドが誤ってトリガーされ、ユーザーが問題の<INPUT>要素にデータを入力できなくなります)。

次のコードを使用してHeaderクラスにNativePreviewHandlerを実装することで、バブルアップを「キャンセル」するイベントを正常に分離できます。

        @Override
        public void onPreviewNativeEvent(NativePreviewEvent event) {
            final NativeEvent natEvent = event.getNativeEvent();
            final Element element = natEvent.getEventTarget().cast();
            final String eventType = natEvent.getType();                 
            if ("mousedown".equals(eventType)) {
                if (element.getTagName().equals("INPUT")) {
                    natEvent.preventDefault();
                    natEvent.stopPropagation();
                    event.cancel();
                }
            }
            return;
        }    

残念ながら、preventDefault()stopPropagation()、またはevent.cancel()メソッドの組み合わせは、mousedownイベントが親DataGridのハンドラーにバブリングするのを正常に停止しません。この問題をデバッグしようとすると、DOMであるにもかかわらず、それを確認できました。PreviewEventメソッドがDOMを正常に呼び出しました。eventCancelBubbleおよびDOMeventPreventDefaultDOMdispatchEventメソッドは引き続き起動され、最終的にDataGridをトリガーしました。fireEventColumnSortEvent

カスタムヘッダーの特定の部分がクリックされた場合にGWTDataGridがそれ自体に頼らないようにするためのガイダンス/アプローチは大歓迎です!

4

1 に答える 1

4

Header次のコードスニペットを使用すると、のonBrowserEvent2 APIをオーバーライドすることで、クリック時に列が並べ替えられないようにすることができますDataGrid

@Override
protected void onBrowserEvent2( Event event )
{
    EventTarget eventTarget = event.getEventTarget();
    if ( !Element.is( eventTarget ) )
    {
        return;
    }
    final Element target = eventTarget.cast();
    String id = target.getId();
    if ( id != null && id.equals( COLUMN_HEADER_ID ) )
    {
        return;
    }
    super.onBrowserEvent2( event );
}
于 2012-12-06T03:25:26.913 に答える