jqGrid: использование нескольких методов для фильтрации данных



Мое требование-показать страницу с несколькими фильтрами для применения к сеточным данным.



Предположим, что мы говорим о приказах, и приказ имеет следующие атрибуты



public class Order {
public int OrderID
public DateTime OrderDate
public DateTime ShipmentDate
public int OrderTotal
public int OrderStatus
}


Внутри объекта jqgrid я показываю все атрибуты , кроме OrderStatus



Требуется создать представление, которое имеет




  • jqGrid в левой части

  • панель справа


Внутри правой панели пользователь увидит список флажки, которые представляют все возможные значения OrderStatus, и он хочет искать с помощью обоих методов (например, выбрав флажок "отгруженные заказы", а затем фильтруя сетку с суммой больше, чем значение)



Я уже настроил расширенную фильтрацию (multiplesearch:true) внутри объекта jqGrid и могу создавать сложные фильтры, объединяющие поля и логические операторы.



Любые идеи о том, как я могу отправить даже данные из правой панели, когда пользователь нажимает поиск пуговица?



Обновление 1:



Преамбула: образец Олега фантастический, но, к сожалению, не соответствует требованиям моего клиента : (



@Oleg: я не понимаю, почему вы так думаете:




Если данные находятся за пределами сетки
вы будете показывать детали заказа на
правая панель только для выбранной строки.
Так что пользователю придется не очень хорошо
обзор полученных данных.




Может быть, мое описание было не таким ясным, но я не собираюсь показывать какой-либо порядок деталь. Чтобы лучше прояснить мое требование, я изменил ваш образец, чтобы показать вам желаемый конечный пользовательский интерфейс, который выглядит следующим образом:
Пользовательский интерфейс, как клиент хочет этого



Клиент хочет отфильтровать данные в сетке, используя два метода или оба вместе:




  • использование средств multiplesearch, предоставляемых самой сеткой (спасибо за упоминание обходного пути)

  • С помощью панели пользовательского поиска (та, что с флажками справа), предоставленной


С функциональной точки зрения требование очень легко выразить: когда пользователь нажимает на флажок или делает поиск с помощью собственного multiplesearch, я должен отправить значения на сервер, включая также состояние флажков.



Чтобы подвести итог, я должен:




  • добавьте состояние флажков, когда сообщение сделано через родной multiplesearch

  • добавьте текущее состояние multiplesearch (если оно есть), когда пользователь нажимает на флажок


Есть ли способ сделать это?

765   2  

2 ответов:

Я очень хорошо понимаю это требование. В закрытом случае я использовал флажки внутри jqGrid. Самым большим преимуществом наличия информации внутри jqGrid является не только возможность легкого поиска. Если данные находятся вне сетки, вы будете показывать детали заказа на правой панели только для выбранной строки. Так что у пользователя будет не очень хороший обзор данных.

Чтобы иметь возможность разместить много флажков в таблице без постоянного горизонтальная прокрутка я поворачивал заголовки столбцов, имеющих флажок " с помощью техники, описанной в вертикальный текст внутри заголовков таблиц, используя библиотеку SVG на основе JavaScript. Этот поворот выглядит не идеально в IE, но в другом браузере он работает идеально.

Вы можете хранить данные из поля OrderStatus в скрытом столбце и декодировать битовую маску в boolean, которые создают флажки либо на стороне клиента, либо на стороне сервера.

Потому что я хочу использовать multiplesearch:true я должен упоминание об ошибке в jQuery.clone , которые следуют за ошибкой в jqGrid multi-search во всех версиях браузеров IE. Если вы зададите несколько поисковых фильтров как один, то будет использоваться только первый, так как операционное поле всех остальных фильтров будет читаться как undefined. Жаль, но ошибка также не исправлена в только что опубликованном jQuery 1.4.3. Чтобы иметь возможность использовать multiplesearch:true, Вы можете использовать обходное предложение от Джихо Хана на trirand.com форум .

Все вместе вы можете видеть в демонстрационный пример , который создает сетку

текст Alt

Где можно искать несколько полей

текст Alt

Соответствующий код:

var myData = [
    { orderID: "10", orderDate: "2010-09-18", shipmentDate: "2010-09-20", orderStatus: "2" },
    { orderID: "15", orderDate: "2010-09-20", shipmentDate: "2010-09-24", orderStatus: "3" },
    { orderID: "20", orderDate: "2010-10-16", shipmentDate: "2010-10-17", orderStatus: "1" }
];
// decode 'orderStatus' column and add additional boolean data based on the bitmap mask
for (var i=0, l=myData.length; i<l; i++) {
    var myRow = myData[i];
    var orderStatus = parseInt(myRow.orderStatus, 10);
    myRow.airPost = (orderStatus & 2) != 0? "1": "0";
    myRow.heavy = (orderStatus & 1) != 0? "1": "0";
}
var grid = jQuery('#list');
grid.jqGrid({
    data: myData,
    datatype: 'local',
    caption: 'Order Details',
    height: 'auto',
    gridview: true,
    rownumbers: true,
    viewrecords: true,
    pager: '#pager',
    rownumbers: true,
    colNames: ['Order ID', 'Order', 'Shipment', 'Air-Post', 'Heavy', 'RowVersion'],
    colModel: [
        { name: 'orderID', index: 'orderID', key:true, width: 120, sorttype: 'int' },
        { name: 'orderDate', index: 'orderDate', width: 180,
          sorttype: 'date', formatter: 'date' },
        { name: 'shipmentDate', index: 'shipmentDate', width: 180,
          sorttype: 'date', formatter: 'date' },
        { name: 'airPost', width: 21, index: 'airPost', formatter: 'checkbox', align: 'center',
          editoptions: { value: "1:0" }, stype: 'select', searchoptions: { value: "1:Yes;0:No" } },
        { name: 'heavy', width: 21, index: 'heavy', formatter: 'checkbox', align: 'center',
          editoptions: { value: "1:0" }, stype: "select", searchoptions: { value: "1:Yes;0:No" } },
        { name: 'orderStatus', index: 'orderStatus', width: 50, hidden: true }
    ]
}).jqGrid ('navGrid', '#pager', { edit: false, add: false, del: false, refresh: true, view: false },
            {},{},{},{multipleSearch:true})
  .jqGrid ('navButtonAdd', '#pager', { caption: "", buttonicon: "ui-icon-calculator", title: "choose columns",
      onClickButton: function() {
          grid.jqGrid('columnChooser');
      }
  });

Где rotateCheckboxColumnHeaders и исправление в расширенном поиске определено так

// we use workaround from http://www.trirand.com/blog/?page_id=393/bugs/in-multiple-search-second-and-subsequent-ops-are-sent-as-undefined-in-ie6/
// to fix the bug in the jQuery.clone (see http://bugs.jquery.com/ticket/6793 and
// dscussion on the http://api.jquery.com/clone/
jQuery.event.special.click = {
    setup: function() {
        if (jQuery(this).hasClass("ui-search")) {
            jQuery(this).bind("click", jQuery.event.special.click.handler);
        }
        return false;
    },
    teardown: function() {
        jQuery(this).unbind("click", jQuery.event.special.click.handler);
        return false;
    },
    handler: function(event) {
        jQuery(".ui-searchFilter td.ops select").attr("name", "op");
    }
};
var rotateCheckboxColumnHeaders = function (grid, headerHeight) {
    // we use grid as context (if one have more as one table on tnhe page)
    var trHead = jQuery("thead:first tr", grid.hdiv);
    var cm = grid.getGridParam("colModel");
    jQuery("thead:first tr th").height(headerHeight);
    headerHeight = jQuery("thead:first tr th").height();

    for (var iCol = 0; iCol < cm.length; iCol++) {
        var cmi = cm[iCol];
        if (cmi.formatter === 'checkbox') {
            // we must set width of column header div BEFOR adding class "rotate" to
            // prevent text cutting based on the current column width
            var headDiv = jQuery("th:eq(" + iCol + ") div", trHead);
            headDiv.width(headerHeight).addClass("rotate");
            if (!jQuery.browser.msie) {
                if (jQuery.browser.mozilla) {
                    headDiv.css("left", (cmi.width - headerHeight) / 2 + 3).css("bottom", 7);
                }
                else {
                    headDiv.css("left", (cmi.width - headerHeight) / 2);
                }
            }
            else {
                var ieVer = jQuery.browser.version.substr(0, 3);
                // Internet Explorer
                if (ieVer !== "6.0" && ieVer !== "7.0") {
                    jQuery("span", headDiv).css("left", 0);
                    headDiv.css("left", cmi.width / 2 - 4).css("bottom", headerHeight / 2);
                }
                else {
                    headDiv.css("left", 3);
                }
                headDiv.parent().css("zoom",1);
            }
        }
    }
};

Если вы предпочитаете держать флажки вне сетки, вы можете выполнить декодирование битовой маски OrderStatus внутри обработчика событий onSelectRow.

Обновлено : я действительно что-то недопонял ваши требования в самом начале. Посмотрите на модифицированный пример . Теперь это выглядит так текст Alt

И это более близко к тому, что вам нужно.

Просто в качестве продолжения я включаю здесь другой метод, который я нашел, чтобы получить тот же результат.

Этот метод предполагает использование параметра postData jqGrid. Внутри метода я определил различные функции, которые проверяют текущее состояние флажков и отправляют параметр на сервер, где он может быть использован для фильтрации.

Это образец

postData: {
    pending: function () {
        if ($("#cb_pending").is(':checked')) {
            return true;
        } else {
            return false;
        }
    }
}

Преимущество этого решения по отношению к изображенному Олегом заключается в том, что можно использовать смешанные логические операторы (и/или) на стороне сервера, тогда как использование секции фильтров, как в ответе Олега , невозможно.

Счастливого кодирования!

Comments

    Ничего не найдено.