2011-09-15 15 views
8

मैं जीडब्ल्यूटी 2.3 का उपयोग कर रहा हूं। मैं जीडब्ल्यूटी सेल टेबल का उपयोग कर रहा हूं।जीडब्ल्यूटी सेल टेबल पर खोज की तरह कैसे आवेदन करें?

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 रूप हैं.अब यदि उपयोगकर्ता सेल तालिका के ऊपर कुछ फ़िल्टर टेक्स्टबॉक्स में 'ऐप' लिखता है तो उस फॉर्म में 'एप' नामक सभी फॉर्म फ़िल्टर किए जाएंगे और ग्रिड में केवल वे रूप हैं केवल।

यह पहला मामला है:

एक और मामला है मैं कर रहा हूँ केवल ग्रिड name.I में एक स्तंभ प्रपत्र (विवरण, टैग) .लेकिन मैं फिल्टर के लिए them.now प्रतिपादन नहीं कर रहा हूँ में दो और गुण है प्रस्तुत करना यदि उपयोगकर्ता फ़िल्टर बॉक्स में 'ऐप' लिखता है तो उसे तीनों (नाम, विवरण और टैग) के लिए एक प्रश्न बनाना चाहिए और यदि 'ऐप' तीन में से किसी से मेल खाता है तो वापस लौटना चाहिए।

मुझे सेल तालिका में फ़िल्टर को लागू करने का तरीका नहीं मिल रहा है। कृपया मेरी मदद करें। अग्रिम धन्यवाद।

उत्तर

4

आप expenses नमूना में एक कार्यान्वयन पा सकते हैं।

ये कदम उठाएँ

1.) एक पाठ बॉक्स और एक SearchButton बनाएं का एक संक्षिप्त सार है।
2.) (SearchButton करने के लिए एक clickHandler जोड़ने तुम भी वैकल्पिक रूप से पाठ बॉक्स को KeyUpHandler जोड़ सकते हैं)

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

3.) खोज समारोह में searchString निकालते हैं और यह दुकान।

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

में searchString एक और समाधान काफी आसान कई बार इस्तेमाल किया जा सकता है क्या प्रस्ताव कर सकते हैं लेने के लिए अपने setdata() फ़ंक्शन को संशोधित। आइडिया आपके सेलटेबल के लिए कस्टम प्रदाता बनाना है। 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()); 
     } 
    } 
} 
संबंधित मुद्दे