0

私は:

  • クライアントクラス
  • リストビュー
  • テキストフィールド

テーブルを作成するには、ListViewにデータを入力する必要があります。

作業コード:

clientModel = new LoadableDetachableModel() {

            @Override
            protected Object load() {

                return Client.getClientListByCompanyName(searchClientInput.getValue());
            }
        };

        searchClientInput.setModel(new Model<String>());

        searchClientInput.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {

                target.add(clientListViewContainer);
            }
        });

        clientListView = new ListView<Client>(CLIENT_ROW_LIST_ID, clientModel) {

            @Override
            protected void populateItem(ListItem<Client> item) {

                Client client = item.getModelObject();

                item.add(new Label(CLIENT_ROW_COMPANY_CNPJ_ID, client.getCompanyName()));
                item.add(new Label(CLIENT_ROW_COMPANY_NAME_ID, client.getCompanyCnpj()));
            }
        };

        clientListViewContainer.setOutputMarkupId(true);

        clientListViewContainer.add(clientListView);

        add(clientListViewContainer);

これで、HTMLにTextFieldがあります。ユーザーがこのTextFieldに何かを入力するたびに、入力した内容がデータベースで選択されます。したがって、単語ごとに選択が行われ、テーブルを更新する必要があります。AJAXとおそらくモデルを使用する必要があると思います。私はこれをどのように行うことができるかについて少し迷っています。誰かが私に例を提供してくれるなら、私は非常に感謝するでしょう。

編集:例外をスローしている新しいコード:Last cause: Attempt to set model object on null model of component: searchClientForm:searchClientInput

編集2:わかりました。例外は、TextFieldにデータをバインドするモデルがなかったことです。だから私がしたことは:searchClientInput.setModel(new Model<String>());

イベントにも問題がありました。使用onkeydownは機能していましたが、意図したとおりではありませんでした。私は会社名1-4を持っていました。会社名1を入力した場合、テーブルが更新されるように、もう一度1つのキーを押す必要があります。これonkeyupでは起こりません。助けてくれてありがとう。

4

2 に答える 2

2

TextField の値に一致する選択されたクライアントを提供する LoadableDetachableModel を ListView に与えることができます。

TextField で AjaxFormComponentUpdatingBehavior を使用して、ListView の親をリクエスト ターゲットに追加します (#setOutputMarkupId() を忘れないでください)。

于 2012-08-24T05:34:27.943 に答える
1

あなたが望むことを実行する最良の方法(入力の変更ごとにテーブル/リストを再描画する-> DBアクセス)は、DataViewとDataProviderを使用することだと思います。

DataView は、表示するデータを取得するために IDataProvider を使用することを除いて、ListView コンポーネントと同じです。DB にアクセスできるように DataProvider を実装でき、DataProvider に制限 (where句) を追加できます。

[これは疑似コードに似ています]

public final class MyDataProvider<T> extends SortableDataProvider<T> {
// ...
Set filters; 
// filters is the set where the restrictions you want to apply are stored


...
@Override
public Iterator<T> iterator(int first, int count) {
    // DAO (Data Access Object) access to DB
    // ...
    return dao.findByRestrictions(filters).iterator();
}
...
}

入力コンポーネントの ajax イベントで、DataProvider で使用されているフィルターを更新できるようになり、DataView の次の再描画で、プロバイダーはフィルターで定義された制限に一致するデータを「プル」します。

それが役に立てば幸い。よろしくお願いします。

于 2012-08-24T16:07:21.930 に答える