2011-09-15 16 views
8

Estoy usando GWT 2.3.I que estoy usando la tabla de células GWT. A continuación es el código de mi tabla de celdas:¿Cómo aplicar una búsqueda similar en la tabla de células 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; 
} 

}

En esta columna mi juego y juego de datos se llama lado a otro superclase flow.This tabla de celdas está trabajando muy bien. Ahora quiero poner un recurso de tipo de filtro (como búsqueda) en esta tabla de celda. Debería ser como, hay un texbox encima de la tabla de celda y lo que haya escrito en ese cuadro de texto, debe iniciar una consulta similar a toda forma nombre para ese valor de cuadro de texto.

por ejemplo Tengo 1000 formulario en la grilla.Ahora si el usuario escribe 'aplicación' en algún cuadro de texto de filtro sobre la tabla de celdas se filtrará todo el formulario que tiene 'aplicación' en su nombre y la cuadrícula solo tiene esos formularios solamente.

Este es el primer caso:

Otro caso es estoy solamente hacer una columna en rejilla name.I tienen dos propiedades más en forma (descripción, etiqueta) .Pero no estoy Rendering them.now para el filtro si el usuario escribe 'aplicación' en el cuadro de filtro, debe hacer una consulta a los tres (nombre, descripción y etiqueta) y debe regresar si 'aplicación' coincide con cualquiera de tres.

No obtengo cómo aplicar el filtro en la tabla de células. Por favor, ayúdenme. Gracias de antemano.

Respuesta

4

Puede encontrar una implementación en la muestra expenses.

Aquí es un breve resumen de los pasos

1.) Crear un cuadro de texto y una SearchButton.
2.) añadir un clickHandler a la SearchButton (También puede agregar keyUpHandler al cuadro de texto como alternativa)

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

3.) En la función de búsqueda recuperar el searchString que y almacenarlo.

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

4.) modificar la función SetData() para tomar en cuenta searchstring

@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

puede proponer otra solución que se puede utilizar bastante fáciles varias veces. Idea es crear un proveedor personalizado para su celltable. GWT celltable filtering

Video en este post muestra en acción.

Aquí está la parte del código del proveedor de datos de lista personalizada que debe implementar.

@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()); 
     } 
    } 
} 
Cuestiones relacionadas