1

SelectableListTableContentProvider を使用してテーブルにデータを入力する Web サービスがありますが、これはうまく機能します。

ただし、テーブルにフィルター入力コントロールを追加すると、クライアント側で現在のテーブルの内容をフィルター処理するだけです。つまり、テーブルの 1/10 ページにいる場合、すべての値をチェックしません。 、1ページのものだけ。

Web サービスが返すことができるすべての値に対してフィルター入力コントロール フィルターを作成するにはどうすればよいですか?

4

1 に答える 1

3

方法は次のとおりです。

  1. あなたが言うようにSelectableListTableContentProvider(それを と呼びましょうmyDataProvider) を作成し、Web サービス、プロバイダー、および画面の間ですべてのものが機能することを確認します。これは、ここで間違いがあり、次のビットが正しく機能しない場合に備えてのことです。見た目が正常であること、データが適切にページングされていることなどを確認してください。テーブルにはわかりやすい ID を付けてください。

  2. 画面に Filter Input コントロールを追加します。Forプロパティをテーブルの ID に設定します。

  3. コードに入り、myDataProviderのタイプを からSelectableListTableContentProviderに変更しますFilterableSelectableListTableContentProvider。変数の宣言でそれを行う必要があります。

    SelectableListTableContentProvider myDataProvider;
    

    ゲッターの 2 か所:

    public com.webmethods.caf.faces.data.object.SelectableListTableContentProvider getMyDataProvider()  {
      if (myDataProvider == null) {
        metadataOrganisationProvider = (com.webmethods.caf.faces.data.object.SelectableListTableContentProvider)resolveExpression("#{myDataProvider}");
      }
    
      resolveDataBinding(MYDATAPROVIDER_PROPERTY_BINDINGS, myDataProvider, "myDataProvider", false, false);
      return myDataProvider;
    }
    

    AND の管理対象 Bean 構成内faces-config.xml:

    <managed-bean>
    <managed-bean-name>myDataProvider</managed-bean-name>
    <managed-bean-class>com.webmethods.caf.faces.data.object.SelectableListTableContentProvider</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <description>Specifies whether the session bean expires when the pageflow is out of scope</description>
        <display-name>Expire With Page Flow</display-name>
        <property-name>expireWithPageFlow</property-name>
        <property-class>java.lang.Boolean</property-class>
        <value>true</value>
    </managed-property>
    

    各例では、変更の様子を示しています。Filterの前に単語を追加するだけSelectableListTableContentProviderです。

    これで、フィルター可能なコンテンツ プロバイダーができました。

  4. 実行しようとすると、この時点で画面がエラーになります。なんで?良い質問。なぜ、Software AG? 賢明なデフォルトを提供してみませんか? デフォルトですべてをフィルタリングするクライアント側の Filter Input コントロールの既定の動作とは異なり、どのフィールドでフィルタリングするかを選択する必要があるのはなぜですか?

    ともかく。[バインディング] ウィンドウでフィルター可能なプロバイダーを開きます。彼らがこれをできる限りうまく構成しているとは思わないので、少し奇妙に見えます。Row Filter Value Bindingプロパティ (アイコンはボックス内の * です。なぜ文字列でないのかわかりません) を選択し、その Data Binding プロパティをプロバイダーの正しいフィールドのControls Scoped Variableに設定します。

    それは意味がありませんか?さて、私はそれを分解します:

    1. WYSIWYG ビューでテーブルをクリックします。テーブルの行ではなく、テーブル全体です。これが選択されたままになっていることを確認し、誤って選択を解除しないようにしてください。
    2. [Row Filter Value Bindingバインディング] ペインで、プロバイダーの下にある をクリックします。
    3. [プロパティ] ペインで、[データ バインディング] タブに移動し、#{...}ボタンをクリックして目的の値を参照します。
    4. 開いたポップアップで、一番上までスクロールしてControls Scoped Variablesセクションを開きます。これが存在しない場合は、a) に戻って適切に実行してください :)
    5. フィルタリングする値を選択します。
    6. 大丈夫です。フィールドは次のようにバインドされます。

      #{result.nameOfFieldToFilterOn}
      

展開してお楽しみください:)

于 2014-10-23T08:34:33.883 に答える