0

更新 2:以下の自分の質問に回答しました


更新:グリッドの列のメソッドが正しい値を返していることを確認しましたgetValue()- データベース内の値であり、ローカル編集によって作成された値ではありません。つまり、 によって返される値は、それ自体に表示される値でgetValueはありませんDataGrid。リフレッシュ/更新していないものはありますか? これはどのように起こりますか?


メソッドとDataGridを使用して更新している があります。グリッドに表示されるオブジェクトは変更可能で、すべての列に対応する があり、 に渡されたリスト内のオブジェクトを直接変更します。ユーザーが要求すると、グリッドは新しいデータベース クエリ (および古いリストとは完全に異なるオブジェクトの新しいリスト) で再設定されます。setRowCount()setRowData()FieldUpdaterDataGrid

ローカルで行ごとの変更を行い、必要に応じてコミットする機能を実装するまで、すべてが正常に機能していました。コミットが発生すると、データベースは現在その行にあるオブジェクトの値で更新されます。セルが変更されてもコミットが開始されていない場合、リストに保持されているオブジェクトは変更されますが、データベースの変更は行われません。

問題は、何らかの理由で、によって表示されている現在のリストがDataGridローカルのコミットされていない値を保持している場合、DataGrid更新時にコミットされていないローカル値がデータベース値に戻ると予想されるときにまだ含まれていることです。に設定されているリストにDataGridは正しいデータベース値が含まれていますが、何らかの理由でこれらが無視されています。値は、ブラウザでページ全体が更新されたときにのみデータベースの値に更新されます (もちろん、すべてを再読み込み/メモリをクリアするなど)。

私が使用している更新コードは以下のとおりです。不要な可能性のある手順をいくつか追加しましたが、すべて役に立ちませんでした。入力リストに何を設定してもDataGrid、ローカル値が表示されます。

private void update(List<TheObject> newRows) {
    // newRows contains the correct database-side committed values and none of the local, uncommitted values

    dataGrid.setRowCount(0, true);
    dataGrid.setRowData(java.util.Collections.<TheObject> emptyList());
    dataGrid.redraw();
    // at this point, dataGrid.getVisibleItems() returns an empty list

    dataGrid.setRowCount(newRows.size(), true);
    dataGrid.setRowData(newRows);
    dataGrid.redraw();
    // at this point, dataGrid.getVisibleItems() returns a list containing the database values and none of the local values, which is correct
}

ただし、このメソッドが完了すると、ローカル値を含まないgetVisibleItems()正しいデータベース値が常に表示されるにもかかわらず、グリッドにはまだコミットされていないローカル値が表示されます。基本的に、 に渡されたリストに従って表示されるべきsetRowData()ものと、実際に表示されるものとの間に明確なミスマッチがあります。

他にも重要な/興味深い点がいくつかあります。

  • 新しいリストに含まれるオブジェクトは、古いリストに含まれていたものとはまったく異なるオブジェクト インスタンスです。
  • グリッドの行数がゼロに設定された後update()、メソッド中にキャッチされない例外がスローされた場合 (その結果、空のテーブルが生成されます)、次にメソッドが正常に呼び出されたときに、ローカル値がデータベース値に正しく置き換えられます。
  • 上記に基づいて、グリッドがクリアされた後のすべてのコードをscheduleDeferred()メソッドに入れてみました。ただし、問題はまだ存在します。
  • グリッドが保持するオブジェクトは同じ static を共有し、KeyProviderこのプロバイダーによってグリッドに送信される新しい値は、グリッドがクリアされる前にすでに存在していた値と同じキーを持ちます。これは何か関係があるのでしょうか?

一般的な答えは「この問題があり、ListDataProvider を使用して修正した」というものかもしれませんが、まったく新しい質問を正当化する理由により、これは現在不可能です。

どんな助けでも大歓迎です:)

4

1 に答える 1

0

The problem appears to be fixed. In order to get the correct behaviour, I added a call todataGrid.redraw() inside each column's FieldUpdater. That's it.

someColumn.setFieldUpdater(new FieldUpdater<TheObject, String>() {

    @Override
    public void update(int index, TheObject object, String value) {

        object.setSomeValue(value);
        dataGrid.redraw();
    }
});

I have no idea why this should be necessary, but there you go. Any thoughts on this would still be appreciated because it has left me a little untrusting of the whole GWT thing...

Thanks for all those who read the question.

于 2013-05-01T08:27:44.073 に答える