轉至:http://blog.csdn.net/gengv/article/details/5725172
作者:gengv
這篇主要講的是jqGrid的查找功能。
根據官方文檔的介紹,jqGrid的查找功能分四種:
- 工具條查詢;
- 自定義查詢;
- 單條件表單查詢;
- 高級表單查詢(複雜條件查詢);
我個人認爲這樣劃分比較複雜,可以基本分爲兩大類,即:
表單查詢:包括單條件查詢和高級查詢(複雜條件查詢);
工具條查詢:包括工具條查詢和自定義查詢;
而這兩大類中,也以表單查詢更常用。
現在逐個說明一下(我改變了官方文檔的講解順序,我覺得自己的這個順序,更直觀,更靠近現實使用)。
1. 單條件表單查詢
先從服務器端看起,爲了配合jqGrid的查詢功能,我們需要在JqGridBaseAction類中添加幾個成員變量。成員變量的名字必須和jqGrid的prmNames選項中定義的參數名相對應上(具體參考本系列文章的第一篇)。
改進後的JqGridBaseAction類代碼:
- package cn.gengv.struts2ex.jqGrid;
-
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
-
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.dao.impl.Criterion.CompareType;
- import com.opensymphony.xwork2.ActionSupport;
-
- @SuppressWarnings("serial")
- public abstract class JqGridBaseAction<T> extends ActionSupport {
- private List<T> gridModel = Collections.emptyList();
- private Integer rows = 0;
- private Integer page = 0;
- private Integer total = 0;
- private Integer record = 0;
- private String sord;
- private String sidx;
-
- // (1)添加和查詢有關的成員變量search、searchField、searchString、searchOper
- private boolean search;
- private String searchField;
- private String searchString;
- private String searchOper;
-
- public abstract int getResultSize();
- public abstract List<T> listResults(int from, int length);
-
- // (2)添加用於根據條件進行查詢的方法
- public abstract int getResultSize(List<Criterion> criteria);
- public abstract List<T> listResults(List<Criterion> criteria, int from, int length);
-
- public String refreshGridModel() {
- try {
- List<Criterion> criteria = Collections.emptyList();
-
- // (3)如果search值爲true,則表明是查詢請求
- if(search == true) {
-
- // (4)通過searchField、searchString、searchOper生成通用的查詢條件
- Criterion criterion = this.generateSearchCriterion(searchField, searchString, searchOper);
-
- criteria = new ArrayList<Criterion>();
-
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
-
- int from = rows * (page - 1);
- int length = rows;
-
- List<T> results = Collections.emptyList();
-
- if(!criteria.isEmpty()) { // (5)如果criteria列表不爲空,則根據條件進行查詢
- record = this.getResultSize(criteria);
- results = this.listResults(criteria, from, length);
-
- } else {
- record = this.getResultSize();
- results = this.listResults(from, length);
-
- }
-
- this.setGridModel(results);
- total = (int) Math.ceil((double) record / (double) rows);
- return SUCCESS;
- } catch (Exception e) {
- e.printStackTrace();
- this.addActionError(e.getMessage());
- return ERROR;
- }
- }
-
- // (6)通過searchField、searchString、searchOper三個參數生成Criterion的方法
- public Criterion generateSearchCriterion(String searchField,
- String searchString, String searchOper) {
- Criterion criterion = null;
-
- // (7)如果searchField、searchString、searchOper均不爲null,且searchString不爲空字符串時,則創建Criterion
- if (searchField != null && searchString != null
- & searchString.length() > 0 && searchOper != null) {
- if ("eq".equals(searchOper)) {
- criterion = Criterion.getEqualCriterion(searchField,
- searchString, null);
- } else if ("ne".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.NE,
- searchField, searchString, null);
- } else if ("lt".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.LT,
- searchField, searchString, null);
- } else if ("le".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.LTE,
- searchField, searchString, null);
- } else if ("gt".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.GT,
- searchField, searchString, null);
- } else if ("ge".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.GTE,
- searchField, searchString, null);
- } else if ("bw".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField,
- searchString + "%", null);
- } else if ("bn".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField,
- searchString + "%", null);
- } else if ("ew".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField, "%"
- + searchString, null);
- } else if ("en".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField, "%"
- + searchString, null);
- } else if ("cn".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField, "%"
- + searchString + "%", null);
- } else if ("nc".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField, "%"
- + searchString + "%", null);
- }
- }
- return criterion;
- }
-
- // getter和setter
- ...
- }
說明:
- (1)處添加了關於查詢使用到的成員變量,這些成員變量會接收從客戶端jqGrid傳來的參數,這些參數的名稱都是由jqGrid的prmNames選項定義的;
- (2)處添加了兩個方法,用於根據條件列表,進行數據記錄查詢;(關於條件列表List<Criterion>稍後介紹);
- (3)處判斷成員變量search的值,如果是查詢請求,jqGrid會發送search值爲true的請求;
- (4)(6)(7)通過searchField、searchString、searchOper三個參數生成Criterion的方法;以前在學習Hibernate的時候,裏面就介紹過使用Criterion的方式;有的朋友對Hibernate奉若神明,但我一直對Hibernate的靈活度不太滿意;不過這種將查詢條件抽象出來的思路還是值得借鑑的。因此,我雖然後臺使用的是Spring的JdbcTemplate,但爲了抽象化Dao內的操作,我自己寫了一個Criterion類(具體代碼在後面)。使用這個Criterion列表來簡化查詢條件在各個層的傳遞。
- (5)如果條件列表不爲空,則調用新加入的條件查詢方法。
Criterion類的代碼:
- package com.byzl.hare.dao.impl;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class Criterion {
- public static enum CriterionType {
- EQUAL, LIKE, COMPARE, NOT_LIKE
- }
- public static enum CompareType {
- GT, GTE, LT, LTE, EQ, NE
- }
- private CriterionType criterionType;
- private String tableName;
- private String field;
- private Object value;
- // 將Criteria轉換爲SQL條件語句
- public static String convertToSql(List<Criterion> criteria) {
- String criteriaString = "";
- StringBuilder sb = new StringBuilder();
- for (Criterion criterion : criteria) {
- String prefix = criterion.getFieldPrefix();
- switch (criterion.getCriterionType()) {
- case EQUAL:
- sb.append(prefix + criterion.getField() + "=? and ");
- break;
- case LIKE:
- sb.append(prefix + criterion.getField() + " like ? and ");
- break;
-
- case NOT_LIKE:
- sb.append(prefix + criterion.getField() + " not like ? and ");
- break;
- case COMPARE:
- CompareType compareType = ((CompareCriterion) criterion)
- .getCompareType();
- switch (compareType) {
- case EQ:
- sb.append(prefix + criterion.getField() + "=? and ");
- break;
- case NE:
- sb.append(prefix + criterion.getField() + "<>? and ");
- break;
- case GT:
- sb.append(prefix + criterion.getField() + ">? and ");
- break;
- case GTE:
- sb.append(prefix + criterion.getField() + ">=? and ");
- break;
- case LT:
- sb.append(prefix + criterion.getField() + "<? and ");
- break;
- case LTE:
- sb.append(prefix + criterion.getField() + "<=? and ");
- break;
- }
- break;
- }
- }
- int i = -1;
- if ((i = sb.lastIndexOf(" and ")) != -1) {
- criteriaString = sb.substring(0, i);
- }
- return criteriaString;
- }
- // 將Criteria各條件的值轉換爲List<Object>
- public static List<Object> getCriteriaValues(List<Criterion> criteria) {
- List<Object> criteriaValues = criteria.isEmpty() ? Collections
- .emptyList() : new ArrayList<Object>();
- for (Criterion criterion : criteria) {
- criteriaValues.add(criterion.getValue());
- }
- return criteriaValues;
- }
- public CriterionType getCriterionType() {
- return criterionType;
- }
- public void setCriterionType(CriterionType criterionType) {
- this.criterionType = criterionType;
- }
- public String getField() {
- return field;
- }
- public void setField(String field) {
- this.field = field;
- }
- public Object getValue() {
- return value;
- }
- public void setValue(Object value) {
- this.value = value;
- }
- public static Criterion getCompareCriterion(CompareType compareType,
- String field, Object value, String tableName) {
- CompareCriterion compareCriterion = new CompareCriterion();
- compareCriterion.setCriterionType(CriterionType.COMPARE);
- compareCriterion.setCompareType(compareType);
- compareCriterion.setField(field);
- compareCriterion.setValue(value);
- compareCriterion.setTableName(tableName);
- return compareCriterion;
- }
- public static Criterion getLikeCriterion(String field, Object value,
- String tableName) {
- LikeCriterion likeCriterion = new LikeCriterion();
- likeCriterion.setCriterionType(CriterionType.LIKE);
- likeCriterion.setField(field);
- likeCriterion.setValue(value);
- likeCriterion.setTableName(tableName);
- return likeCriterion;
- }
-
- public static Criterion getNotLikeCriterion(String field, Object value,
- String tableName) {
- NotLikeCriterion notLikeCriterion = new NotLikeCriterion();
- notLikeCriterion.setCriterionType(CriterionType.NOT_LIKE);
- notLikeCriterion.setField(field);
- notLikeCriterion.setValue(value);
- notLikeCriterion.setTableName(tableName);
- return notLikeCriterion;
- }
- public static Criterion getEqualCriterion(String field, Object value,
- String tableName) {
- EqualCriterion equalCriterion = new EqualCriterion();
- equalCriterion.setCriterionType(CriterionType.EQUAL);
- equalCriterion.setField(field);
- equalCriterion.setValue(value);
- equalCriterion.setTableName(tableName);
- return equalCriterion;
- }
- public static class LikeCriterion extends Criterion {
- }
-
- public static class NotLikeCriterion extends Criterion {
- }
- public static class EqualCriterion extends Criterion {
- }
- public static class CompareCriterion extends Criterion {
- private CompareType compareType;
- public CompareType getCompareType() {
- return compareType;
- }
- public void setCompareType(CompareType compareType) {
- this.compareType = compareType;
- }
- }
- public String getTableName() {
- return tableName;
- }
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
- public String getFieldPrefix() {
- return (tableName == null || tableName.length() == 0) ? "" : tableName
- + ".";
- }
- }
簡要說明一下:
- 我把Criterion分成4類:EqualCriterion、CompareCriterion、LikeCriterion、NotLikeCriterion。(具體劃分方式全爲使用方便)
- 另外還有兩個靜態方法:convertToSql和getCriteriaValues,用來將Criterion列表轉化爲JdbcTemplate需要的SQL子句和參數列表。
回到ListContactsAction,代碼如下:
- package cn.gengv.struts2ex.jqGrid;
-
- import java.util.Collections;
- import java.util.List;
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.model.Contact;
- import com.byzl.hare.service.ContactService;
-
- @SuppressWarnings("serial")
- public class ListContactsAction extends JqGridBaseAction<Contact> {
-
- private ContactService contactService;
-
- @Override
- public String execute() {
- return this.refreshGridModel();
- }
-
- @Override
- public int getResultSize() {
- return this.contactService.queryResultsCount(null);
- }
- @Override
- public List<Contact> listResults(int from, int length) {
- return this.contactService.queryByPage(null, from, length);
- }
-
- @Override
- public int getResultSize(List<Criterion> criteria) {
- return this.contactService.queryResultsCount(criteria);
- }
-
- @Override
- public List<Contact> listResults(List<Criterion> criteria, int from, int length) {
- List<Contact> results = Collections.emptyList();
-
- results = this.contactService.queryByPage(criteria, from, length);
-
- return results;
- }
-
- public void setContactService(ContactService contactService) {
- this.contactService = contactService;
- }
- }
OK,服務器端的工作就先這樣了,應對單條件查詢已經足夠了。再來看看客戶端需要什麼特別的。
jqGrid的單條件查詢和高級查詢(複雜條件查詢)都是基於表單的查詢,使用的都是jqGrid的searchGrid方法:
$("#grid_id").searchGrid( options );
或者
$("#grid_id").jqGrid('searchGrid', options );
注:要想使用searchGrid方法,在下載jqGrid的時候,必須包含Common, Form Edit, Search Plugin的模塊。
在Navigator按鈕欄中的查詢按鈕,默認就是調用這個方法。
searchGrid也有很多選項,在language文件(grid.locale-xx.js)中,有關於這些選項的默認值定義。下面介紹一下主要常用的選項:
- afterShowSearch :用於定義每次查詢對話框顯示之後,要執行的事件函數;
- beforeShowSearch :用於定義每次查詢對話框顯示之前,要執行的事件函數;
- caption :查詢對話框的標題;
- closeAfterSearch :如果設爲true,則每次在查詢對話框中點擊「查詢」按鈕完成查詢後,對話框都會被關閉;默認爲false;
- closeAfterReset :如果設爲true,則每次在查詢對話框中點擊「重置」按鈕完成查詢後,對話框都會被關閉;默認爲false;
- closeOnEscape :如果設爲true,則當按ESC鍵的時候,對話框會被關閉;默認爲false;
- Find :查詢對話框裏「查詢」按鈕上的文本;
- Reset :查詢對話框裏「重置」按鈕上的文本;
- sopt :用來設置通用的查詢規則,如['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'];如果爲設置,則使用全部規則;
- odata :用來翻譯sopt中規則的對應數組;
- onClose :當查詢對話框關閉時,將要執行的事件函數。可以返回true或false;如果返回false,則查詢對話框不會被關閉。
- onInitializeSearch :當查詢對話框創建時,將要執行的事件函數。
- recreateFilter :如果設置爲true,則當動態改變colModel的屬性時,重建查詢並解除時間綁定。
- sField, sOper, sValue :當提交查詢請求時,對應着所包含的有關於查詢的參數;默認值分別是'searchField','searchOper','searchString'。
以上這些就是關於單條件查詢的選項;關於複雜條件查詢的選項稍後介紹。
注意:在searchGrid方法中設定這些選項,和在navGrid方法的prmSearch參數中設置這些選項(參見上一篇),作用效果是相同的。
即
- var singleCriterionSearch = function() {
- $("#gridTable").jqGrid("searchGrid", {
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true
- });
- };
等同於
- $("#gridTable").jqGrid("navGrid", "#gridPager", {},{},{},{},
- { // 與查詢相關的prmSearch參數
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true
- },{});
當點擊查詢對話框中的「查詢」按鈕的時候,jqGrid會向Server提交一個請求,例如:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278685481936&rows=15&page=1&sidx=&sord=asc&searchField=id&searchString=9000&searchOper=ge
2. 高級查詢(複雜條件表單查詢)
在上一部分已經提到了,單條件表單查詢和高級查詢(複雜條件表單查詢)都是用的是searchGrid方法,只不過是傳入的選項值有所不同而已。其中最重要的一個選項就是multipleSearch。
下面就來詳細介紹在searchGrid中,與複雜條件查詢相關的主要選項:
- multipleSearch :如果設置爲true,則**複雜條件查詢;默認爲false。
- groupOps :默認通常爲[ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],表示需要滿足多重條件的方式,例如滿足所有查詢條件或者滿足任意查詢條件。
- sFilter :對應着在複雜查詢提交請求時,對應的參數名;默認爲filters。
將javascript代碼改爲:
- $("#gridTable").jqGrid("navGrid", "#gridPager", {},{},{},{},
- { // 與查詢相關的prmSearch參數
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true,
- multipleSearch: true,
- groupOps: [{ op: "AND", text: "全部" }]
- },{});
或者
- var complexCriteriaSearch = function() {
- $("#gridTable").jqGrid("searchGrid", {
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true,
- multipleSearch: true,
- groupOps: [{ op: "AND", text: "全部" }]
- });
- };
除了選項上的不同以外,客戶端的另一個不同之處在於,向Server端傳遞的參數不同。在第一部分的例子中可以看到,當單條件查詢提交請求的時候,傳遞的參數是:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278685481936&rows=15&page=1&sidx=&sord=asc&searchField=id&searchString=9000&searchOper=ge
即:
- nd: 1278688214496
- page: 1
- rows: 15
- search: true
- searchField: id
- searchOper: ge
- searchString: 9000
- sidx:
- sord: asc
而複雜條件的查詢的參數是下面這種形式:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278688110637&rows=15&page=1&sidx=&sord=asc&filters=%7B%22groupOp%22%3A%22AND%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22id%22%2C%22op%22%3A%22le%22%2C%22data%22%3A%221500%22%7D%2C%7B%22field%22%3A%22lastName%22%2C%22op%22%3A%22bw%22%2C%22data%22%3A%22LN-3%22%7D%2C%7B%22field%22%3A%22email%22%2C%22op%22%3A%22cn%22%2C%22data%22%3A%22sy%22%7D%5D%7D
即:
- filters: {"groupOp":"AND","rules":[{"field":"id","op":"le","data":"1500"},{"field":"lastName","op":"bw","data":"LN-3"},{"field":"email","op":"cn","data":"sy"}]}
- nd: 1278688110637
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
我們可以發現,傳遞的參數中除了search以外,searchField、searchOper、searchString都不見了,取而代之的是一個filters參數。filters參數查詢條件以及複雜條件的匹配方式封裝成了json的格式,然後傳遞給Server。
針對這種格式的參數,繼續使用第一個例子中的JqGridBaseAction類的查詢方式,顯然是無法應對的。我們必須再次改進JqGridBaseAction類。而關鍵之處就是如何解析這個json格式的filters參數。
爲此,我引入了json-lib庫(http://json-lib.sourceforge.net/ ),其他的關於json的java庫還可以訪問http://www.json.org/ 。
在JqGridBaseAction類中添加方法generateSearchCriteriaFromFilters(),來將filters參數解析爲Criterion列表。
- public List<Criterion> generateSearchCriteriaFromFilters(String filters) {
- List<Criterion> criteria = new ArrayList<Criterion>();
-
- JSONObject jsonObject = JSONObject.fromObject(filters);
-
- JSONArray rules = jsonObject.getJSONArray("rules");
-
- for(Object obj : rules) {
- JSONObject rule = (JSONObject) obj;
-
- String field = rule.getString("field");
- String op = rule.getString("op");
- String data = rule.getString("data");
-
- Criterion criterion = this.generateSearchCriterion(field, data, op);
-
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
-
- return criteria;
- }
其餘部分的代碼:
- package cn.gengv.struts2ex.jqGrid;
-
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
-
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.dao.impl.Criterion.CompareType;
- import com.opensymphony.xwork2.ActionSupport;
-
- @SuppressWarnings("serial")
- public abstract class JqGridBaseAction<T> extends ActionSupport {
- private List<T> gridModel = Collections.emptyList();
- private Integer rows = 0;
- private Integer page = 0;
- private Integer total = 0;
- private Integer record = 0;
- private String sord;
- private String sidx;
-
- private boolean search;
- private String searchField;
- private String searchString;
- private String searchOper;
-
- public abstract int getResultSize();
- public abstract List<T> listResults(int from, int length);
-
- // (1)添加filters成員變量
- private String filters;
-
- public abstract int getResultSize(List<Criterion> criteria);
- public abstract List<T> listResults(List<Criterion> criteria, int from, int length);
-
- public String refreshGridModel() {
- try {
- List<Criterion> criteria = Collections.emptyList();
-
- if(search == true) {
- criteria = new ArrayList<Criterion>();
-
- // (2)將Filter轉化爲Criterion列表,並加入總的Criterion列表
- if(filters != null && filters.length()>0) {
- criteria.addAll(this.generateSearchCriteriaFromFilters(filters));
- }
-
- // (3)將searchField、searchString、searchOper轉化爲Criterion,並加入總的Criterion列表
- Criterion criterion = this.generateSearchCriterion(searchField, searchString, searchOper);
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
-
- int from = rows * (page - 1);
- int length = rows;
-
- List<T> results = Collections.emptyList();
-
- if(!criteria.isEmpty()) {
- record = this.getResultSize(criteria);
- results = this.listResults(criteria, from, length);
-
- } else {
- record = this.getResultSize();
- results = this.listResults(from, length);
-
- }
-
- this.setGridModel(results);
- total = (int) Math.ceil((double) record / (double) rows);
- return SUCCESS;
- } catch (Exception e) {
- e.printStackTrace();
- this.addActionError(e.getMessage());
- return ERROR;
- }
- }
-
-
- public Criterion generateSearchCriterion(String searchField,
- String searchString, String searchOper) {
- ...
-
- }
-
- public List<Criterion> generateSearchCriteriaFromFilters(String filters) {
- List<Criterion> criteria = new ArrayList<Criterion>();
-
- JSONObject jsonObject = JSONObject.fromObject(filters);
-
- JSONArray rules = jsonObject.getJSONArray("rules");
-
- for(Object obj : rules) {
- JSONObject rule = (JSONObject) obj;
-
- String field = rule.getString("field");
- String op = rule.getString("op");
- String data = rule.getString("data");
-
- Criterion criterion = this.generateSearchCriterion(field, data, op);
-
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
-
- return criteria;
- }
- //getter和setter
- ...
- }
經過如上修改,JqGridBaseAction類可以接受單條件查詢和複雜條件查詢請求了。
3. 工具條查詢
再來看看工具條查詢,工具條查詢主要依靠jqGrid的filterToolbar方法:
$("#grid_id").filterToolbar(options);
或者
$("#grid_id").jqGrid('filterToolbar',options);
主要的選項包括:
- autosearch :當在查詢工具條的輸入框中點擊回車,或者select選擇框中的值發生改變的時候,search參數將設爲true,並觸發ajax請求。默認爲true。
- beforeSearch :查詢前觸發的事件函數。如果返回true,則不繼續出發查詢;在這種情況中,可以自己構建查詢參數來查詢數據。其他返回類型,都會觸發查詢。
- afterSearch :查詢後觸發的事件函數。
- beforeClear :當清理輸入值之前觸發的事件函數(例如clearToolbar方法(稍後介紹))。如果設爲true,則不繼續觸發清理查詢事件;這種情況下,可以自己構建參數來從Server獲得數據。其他返回類型,都會觸發事件。
- afterClear :當清理輸入值之後觸發的事件函數(例如clearToolbar方法(稍後介紹))。
- searchOnEnter :如果設爲true,就參考autosearch;如果設爲false,則輸入字符後,立即進行查詢。
- stringResult :決定如何發送查詢參數,如果設爲false,則按key:value對的形式,發送參數;如果設爲true,則按照複雜條件查詢的方式,發送查詢參數(其中包含json格式的filters參數)。
- groupOp :只有stringResult爲true時,此選項纔有效;其值可以爲AND或OR;默認爲AND。
注:sopt選項在此方法中不會起作用。
在stringResult不爲true的情況下,查詢參數是這樣的:
- firstName: FN-cjxxxds3
- lastName: LN-3iviu7o
- nd: 1278692114137
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
- telNo: TEL-gzbn1w
而當stringResult設爲true的情況下,查詢參數會按照複雜條件查詢的方式發送:
- filters: {"groupOp":"AND","rules":[{"field":"lastName","op":"bw","data":"LN-3iviu7o"},{"field":"firstName","op":"bw","data":"FN-cjxxxds3"},{"field":"telNo","op":"bw","data":"TEL-gzbn1w"}]}
- nd: 1278692302168
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
工具條查詢相關的附加方法:
- triggerToolbar :當調用此方法,search參數會變爲true,並向Server提交ajax請求;
- clearToolbar :當調用此方法,清除輸入值,並將search參數設爲false,向Server提交ajax請求;
- toggleToolbar :打開/關閉查詢工具條。
注意以上三種附加方法的調用方式爲:
$("#gridTable")[0].triggerToolbar();
注:一定不能少了「[0]」。
4. 自定義查詢
雖然官方文檔裏將這種查詢方式成爲自定義查詢,但其實就是工具條查詢的變種。無非是改變了查詢工具條的位置以及構建方式。
首先需要在html頁面中建立一個區域,用於存放輸入查詢條件的表單,例如:
<div id="mysearch"></div>
然後構建查詢工具條:
$("#mysearch").filterGrid('#grid_id',options);
或者
$("#mysearch").jqGrid('filterGrid','#grid_id',options);
主要選項:
- gridModel :默認爲false;如果設爲true,則使用colModel中的name、index、edittype、editoptions、search等屬性來構建查詢(只有colModel的search屬性爲true的列會被用來構建查詢表單);如果此項被設爲false,則應構建一個filterModel數組來處理查詢。
- gridNames :默認爲false;僅當gridModel爲true的時候有效,當此項設爲true時,會從jqGrid的colNames選項或得每列的標題。
- filterModel :當gridModel爲false是應該使用該屬性構建查詢表單。(稍後介紹)
- formtype :定義查詢表單應該是橫向排列的還是縱向排列的。
- autosearch :設爲true時,當輸入框中回車或select選擇框值改變時,觸發查詢;設爲false時,通過按鈕觸發查詢。默認爲true。
- formclass/tableclass/buttonclass :應用於表單的樣式。
其他選項,可在真正使用時,查詢文檔。
filterModel: [
…
{label:'LableFild', name: 'colname', stype: 'select', defval: 'default_value', surl: 'someurl', sopt:{optins for the select}},
…
]
注:由於傳遞查詢參數的方式與工具條查詢在stringResult不爲true的情況下類似,即key:value對的格式,因此這種查詢方式對於JqGridBaseAction類來說用處不大。
附加方法:
- triggerSearch :觸發查詢;
- clearSearch :清除查詢表單中的值,並使用空表單或默認值從Server獲得數據。
var sg = jQuery("#mysearch").filterGrid(...)[0]; sg.triggerSearch();sg.clearSearch();sg.triggerSearch();