2011-07-29 27 views
5

Khi phát triển ứng dụng ASP.NET MVC 3 đầu tiên của tôi bằng cách sử dụng jqGrid để hiển thị một số dữ liệu, tôi đang sử dụng bộ lọc tiêu đề cột và cũng cho phép thanh công cụ bộ lọc nâng cao lọc được thực hiện. Độc lập những điều này hoạt động khá tốt.Hai câu hỏi liên quan đến jqGrid Các bộ lọc tiêu đề cột và hộp thoại lọc tiên tiến

Câu hỏi đầu tiên - Có ai là giải pháp để giao tiếp cài đặt bộ lọc tiêu đề cột hiện tại cho bộ lọc nâng cao không?

Ví dụ: người dùng có thể lọc cột "Tên kem", nhập tên một phần, ví dụ: "Sô-cô-la" và nó sẽ lọc xuống "Vụ nổ sô cô la", "Sô-cô-la đen", v.v. . - tuyệt quá. Điều gì sẽ là tốt đẹp để mở bộ lọc nâng cao và có bộ lọc cột "chứa 'Sô-cô-la" tự động được điền trong bộ lọc nâng cao. Tôi nhận ra rằng hướng khác (nơi một người nào đó có thể VÀ HOẶC hai giá trị cho cùng một cột, ví dụ: 'Sô-cô-la' HOẶC 'Caramel') trở nên có vấn đề nhưng theo một hướng khác, có vẻ như nó có thể xảy ra. Có lẽ đây chỉ là một thiết lập của lưới tôi đang mất tích. Bất cứ ai đã giải quyết vấn đề này?

Câu hỏi thứ hai - Tôi hiện có thể lọc một số bộ lọc tiêu đề cột, hiển thị một số kết quả trong lưới và sau đó đi vào hộp thoại bộ lọc nâng cao và thiết lập bộ lọc khác. Điều đó sẽ hiển thị các kết quả chính xác nhưng các bộ lọc tiêu đề cột không bị xóa, tạo ấn tượng rằng tính năng lọc không hoạt động. Làm cách nào tôi có thể đặt lại các bộ lọc tiêu đề cột sau khi sử dụng nhấp vào nút "Tìm" trên hộp thoại?

Trả lời

16

Tôi thấy câu hỏi của bạn rất thú vị, vì vậy tôi đã chuẩn bị the demo minh họa cách người ta có thể kết hợp hộp thoại Advanced SearchingToolbar Searching trong một lưới.

Một mẹo quan trọng nhưng đơn giản là việc sử dụng recreateFilter: true. Theo mặc định, hộp thoại tìm kiếm sẽ được tạo một lần và sau đó sẽ chỉ ẩn hoặc hiển thị. Do đó, thông số postData.filters sẽ không được làm mới. Sau khi thiết lập recreateFilter: true sự cố với việc lấp đầy hộp thoại tìm kiếm nâng cao với các giá trị từ thanh công cụ tìm kiếm sẽ được giải quyết. Cá nhân tôi thiết lập các tùy chọn tìm kiếm mặc định như sau

$.extend(
    $.jgrid.search, 
    { 
     multipleSearch: true, 
     multipleGroup: true, 
     recreateFilter: true, 
     overlay: 0 
    } 
); 

Bây giờ đến phần phức tạp hơn trong những giải pháp là chức năng refreshSerchingToolbar mà tôi đã viết. Các chức năng không phải là quá đơn giản, nhưng nó chỉ đơn giản trong sử dụng:

loadComplete: function() { 
    refreshSerchingToolbar($(this), 'cn'); 
} 

Tham số cuối cùng là tham số tương tự mà bạn sử dụng như defaultSearch sở hữu của phương pháp thanh công cụ tìm kiếm filterToolbar (giá trị mặc định là 'bw', nhưng tôi cá nhân thích sử dụng 'cn' và đặt tham số jqGrid ignoreCase: true).

Nếu bạn điền vào hộp thoại tìm kiếm tiên tiến của the demo với lĩnh vực sau

enter image description here

và nhấp vào "Find" nút, bạn sẽ có lưới điện sau:

enter image description here

(Tôi đã đánh dấu cột 'Tổng cộng' là không thể tìm kiếm được đối với search: false để chỉ hiển thị rằng tất cả đều hoạt động chính xác trong trường hợp này)

Người ta có thể thấy rằng tất cả các trường của thanh công cụ tìm kiếm ngoại trừ "Số tiền" được lấp đầy với các giá trị từ hộp thoại tìm kiếm. Trường không được điền vì chúng tôi đã sử dụng thao tác "vắt hoặc bằng" thay vì "bằng". Chức năng refreshSerchingToolbar lấp đầy chỉ các yếu tố của thanh công cụ tìm kiếm có thể được sản xuất bởi các

Cũng giống như một lời nhắc nhở tôi nên đề cập rằng trong trường hợp việc sử dụng Filter Toolbar nó là rất quan trọng để xác định searchoptions.sopt tùy chọn của colModel. Đối với tất cả các cột không phải chuỗi chứa (ngày, số, lựa chọn, int, tiền tệ), nó là cực kỳ quan trọng để có 'eq' làm thành phần đầu tiên của mảng sopt. Xem herehere để biết chi tiết.

Nếu bạn thay đổi bộ lọc của Dialog Advanced để sau

enter image description here

bạn sẽ có như mong đợi

enter image description here

Cuối cùng tôi bao gồm mã của refreshSerchingToolbar chức năng :

var getColumnIndex = function (grid, columnIndex) { 
     var cm = grid.jqGrid('getGridParam', 'colModel'), i = 0, l = cm.length; 
     for (; i < l; i += 1) { 
      if ((cm[i].index || cm[i].name) === columnIndex) { 
       return i; // return the colModel index 
      } 
     } 
     return -1; 
    }, 
    refreshSerchingToolbar = function ($grid, myDefaultSearch) { 
     var postData = $grid.jqGrid('getGridParam', 'postData'), filters, i, l, 
      rules, rule, iCol, cm = $grid.jqGrid('getGridParam', 'colModel'), 
      cmi, control, tagName; 

     for (i = 0, l = cm.length; i < l; i += 1) { 
      control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 
      if (control.length > 0) { 
       tagName = control[0].tagName.toUpperCase(); 
       if (tagName === "SELECT") { // && cmi.stype === "select" 
        control.find("option[value='']") 
         .attr('selected', 'selected'); 
       } else if (tagName === "INPUT") { 
        control.val(''); 
       } 
      } 
     } 

     if (typeof (postData.filters) === "string" && 
       typeof ($grid[0].ftoolbar) === "boolean" && $grid[0].ftoolbar) { 

      filters = $.parseJSON(postData.filters); 
      if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") { 
       // only in case of advance searching without grouping we import filters in the 
       // searching toolbar 
       rules = filters.rules; 
       for (i = 0, l = rules.length; i < l; i += 1) { 
        rule = rules[i]; 
        iCol = getColumnIndex($grid, rule.field); 
        cmi = cm[iCol]; 
        control = $("#gs_" + $.jgrid.jqID(cmi.name)); 
        if (iCol >= 0 && control.length > 0) { 
         tagName = control[0].tagName.toUpperCase(); 
         if (((typeof (cmi.searchoptions) === "undefined" || 
           typeof (cmi.searchoptions.sopt) === "undefined") 
          && rule.op === myDefaultSearch) || 
           (typeof (cmi.searchoptions) === "object" && 
            $.isArray(cmi.searchoptions.sopt) && 
            cmi.searchoptions.sopt[0] === rule.op)) { 

          if (tagName === "SELECT") { // && cmi.stype === "select" 
           control.find("option[value='" + $.jgrid.jqID(rule.data) + "']") 
            .attr('selected', 'selected'); 
          } else if (tagName === "INPUT") { 
           control.val(rule.data); 
          } 
         } 
        } 
       } 
      } 
     } 
    }; 

CẬP NHẬT: Mã trên không cần thiết trong trường hợp sử dụng free jqGrid 4.13.1 hoặc cao hơn. Nó chứa các tùy chọn mặc định mới loadFilterDefaults: true của filterToolbar, mà làm mới các giá trị của các thanh công cụ lọc và các hoạt động lọc (nếu searchOperators: true tùy chọn filterToolbar được ised) nếu postData.filterssearch: true được set (bộ lọc được áp dụng). JqGrid miễn phí làm mới thanh công cụ bộ lọc trên jqGridAfterLoadComplete (nếu loadFilterDefaults: true được đặt) hoặc nếu sự kiện jqGridRefreshFilterValues được kích hoạt rõ ràng.

+0

@itsmatt: Đó có phải là những gì bạn cần không? – Oleg

+0

Đó là khá kỹ lưỡng, Oleg - Tôi đánh giá cao độ sâu của phản ứng của bạn! – itsmatt

+0

Một trong những biến chứng mà tôi có với lọc ngày là tôi có thể lọc xuống mức tháng và cho đến nay đã giải quyết vấn đề này bằng cách sử dụng GT (lớn hơn) làm toán tử của tôi, vì vậy nếu tôi muốn xem dữ liệu của tháng 6, tôi có thể lọc GT ngày 01 tháng 6 năm 2011 và trong khi không lý tưởng nó mang lại cho tôi tất cả các dữ liệu của tháng Sáu (cùng với, như là một tác dụng phụ, dữ liệu của tháng Bảy quá). Đó có lẽ chỉ là một thiết lập trong bộ chọn ngày mặc dù - cần phải nhìn vào đó, sau đó EQ sẽ làm việc tốt, tôi giả định. – itsmatt

1

Tôi biết đó là một bài đăng cũ - nhưng nếu bạn có nhiều lưới trên cùng một trang, mã trên có thể thêm văn bản lọc vào lưới không đúng.

Thay đổi này trong vòng lặp đầu tiên trong refreshSearchingToolbar, từ

control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 

để

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cm[i].name)); 

và điều này trong vòng lặp thứ hai từ

control = $("#gs_" + $.jgrid.jqID(cmi.name)); 

để

control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cmi.name)); 

nên thực hiện thủ thuật.

Kudos to Oleg

Các vấn đề liên quan