2011-09-15 7 views
8

私はGWTセルテーブルを使用しているGWT 2.3.Iを使用しています。ここでは以下の は私の細胞表のコードです:この私のセット列でGWTセルテーブルの検索のように適用するには?

public class FormGrid extends SuperGrid { 

List<Form> formList; 


@Override 
public void setColumns(CellTable table) { 
    TextColumn<Form> nameColumn = new TextColumn<Form>() { 
     @Override 
     public String getValue(Form object) { 
      return object.getName(); 
     } 
    }; 
    table.addColumn(nameColumn, "Name"); 
} 

@Override 
public void setData() { 
    if (formList != null && formList.size() > 0) { 
     AsyncDataProvider<Form> provider = new AsyncDataProvider<Form>() { 
      @Override 
      protected void onRangeChanged(HasData<Form> display) { 
       int start = display.getVisibleRange().getStart(); 
       int end = start + display.getVisibleRange().getLength(); 
       end = end >= formList.size() ? formList.size() : end; 
       List<Form> sub = formList.subList(start, end); 
       updateRowData(start, sub); 
      } 
     }; 
     provider.addDataDisplay(getTable()); 
     provider.updateRowCount(formList.size(), true); 
    } 
} 

public List<Form> getFormList() { 
    return formList; 
} 

public void setFormList(List<Form> formList) { 
    this.formList = formList; 
} 

}

とスーパークラスは、セルのテーブルが正常に動作しているflow.Thisあちこちにデータが呼び出されますし。 今、このセルテーブルにフィルタタイプの機能(検索など)を入れたいと思っています。セルテーブルの上にテクスチャボックスがあり、そのテキストボックスに何が書かれていても、そのテキストボックス値の名前。

たとえば、私はグリッドに1000のフォームを持っています。ユーザーがセルテーブルの上のいくつかのフィルタテキストボックスに 'app'を書き込むと、そこに 'app'という名前のすべてのフォームがフィルタリングされ、のみ。

これは最初のケースである:

別のケースは、私が唯一の形で2つのプロパティ(説明、タグ)を持つname.Iグリッド内の1つの列をレンダリングしています.But、私はフィルタにthem.nowレンダリングわけではないですユーザーがフィルタボックスに 'app'を書き込むと、3つの名前(説明、タグ)をすべて照会する必要があり、 'app'が3つのいずれかに一致する場合は返されます。

セルテーブルにフィルタを適用する方法がわかりません。 私を助けてください。事前に感謝します。

答えて

4

実装はexpensesサンプルで見つけることができます。ここで

は、テキストボックスや検索]を作成します)手順

1の短い要約です。
2)searchStringのを取得し、それを保存した検索機能で検索](あなたはまた、代わりにテキストボックスにKeyUpHandlerを追加することができます)

searchButton.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
     search(); 
    } 
}); 

3)にはclickHandlerを追加します。

private void search() { 
    searchString = searchBox.getText(); 
    setData(); 
    } 

4)非常に簡単に複数回使用することができるか、別の解決策を提案することができ、アカウント

@Override 
public void setData() { 
    if (formList != null && formList.size() > 0) { 
     AsyncDataProvider<Form> provider = new AsyncDataProvider<Form>() { 
      @Override 
      protected void onRangeChanged(HasData<Form> display) { 
       int start = display.getVisibleRange().getStart(); 
       int end = start + display.getVisibleRange().getLength(); 
       //new function if searchString is specified take into account 
       List<Form> sub = getSubList(start,end); 
       end = end >= sub.size() ? sub.size() : end; 
       updateRowData(sub.subList(start, end);, sub); 
      } 
     }; 
     provider.addDataDisplay(getTable()); 
     provider.updateRowCount(formList.size(), true); 
    } 
} 

private List<Form> getSubList(int start, int end) { 
    List<Form> filtered_list = null; 
    if (searchString != null) { 
     filtered_list= new ArrayList<Form>(); 
     for (Form form : formList) { 
      if (form.getName().equals(searchString) || form.getTag().equals(searchString) || form.getDescription().equals(searchString)) 
       filtered_list.add(form);     
     } 
    } 
    else 
     filtered_list = formList; 
    return filtered_list; 
} 
2

に検索文字取るためにあなたのsetData()関数を変更します。 アイデアはあなたのcelltable用のカスタムプロバイダを作成することです。 GWT celltable filtering

Videoは、この投稿に記載されています。

ここには、実装する必要があるカスタムリストデータプロバイダのコードの一部があります。

@Override 
protected void updateRowData(HasData display, int start, List values) { 
    if (!hasFilter() || filter == null) { // we don't need to filter, so call base class 
     super.updateRowData(display, start, values); 
    } else { 
     int end = start + values.size(); 
     Range range = display.getVisibleRange(); 
     int curStart = range.getStart(); 
     int curLength = range.getLength(); 
     int curEnd = curStart + curLength; 
     if (start == curStart || (curStart < end && curEnd > start)) { 
      int realStart = curStart < start ? start : curStart; 
      int realEnd = curEnd > end ? end : curEnd; 
      int realLength = realEnd - realStart; 
      List<t> resulted = new ArrayList<t>(realLength); 
      for (int i = realStart - start; i < realStart - start + realLength; i++) { 
       if (filter.isValid((T) values.get(i), getFilter())) { 
        resulted.add((T) values.get(i)); 
       } 
      } 
      display.setRowData(realStart, resulted); 
      display.setRowCount(resulted.size()); 
     } 
    } 
} 
関連する問題