How to display indirect data in Jqgrid

前端 未结 2 1666
青春惊慌失措
青春惊慌失措 2020-11-22 08:35

I am implementing Jqgrid in my ASP.net MVC web application. I have data some thing like this:

 SID SNAME CITY
  1   ABC   11
  2   XYZ   12
  3   ACX   13
           


        
相关标签:
2条回答
  • 2020-11-22 09:15

    @Avinash, You can do some trick like this. But still it's not a better solution. It may help you get some idea. What my suggestion is you need to find out better way from your server(ASP.Net) itself. I used grid complete function to modify your data,

    gridComplete: function () {
        var rowIDs = jQuery("#list5").getDataIDs(); 
    for (var i=0;i<rowIDs.length;i=i+1){ 
      rowData=jQuery("#list5").getRowData(rowIDs[i]);
       if (rowData.city == "11") { 
           $("#list5").find('td').eq('5').html('chennai');
       }else if (rowData.city == "12") { 
           $("#list5").find('td').eq('8').html('mumbai');
      }
     }
    }
    

    Hope this helps.

    0 讨论(0)
  • 2020-11-22 09:32

    I answered already on the closed question before (see here). Nevertheless I decide to answer on your question in detail because the problem which you describe is really very common.

    I start with reminding that jqGrid provides formatter: "select" which uses formatoptions.value or editoptions.value to decode ids to texts. The formatter: "select" uses value and optional separator, delimiter and defaultValue properties, but it can't uses editoptions.dataUrl to get required data from the server instead of usage static value. The problem is very easy: processing dataUrl works asynchronous, but during formatting of the column of grid body one don't support delayed filling. So to use formatter: "select" one have to set formatoptions.value or editoptions.value before the server response will be processed by jqGrid.

    In the old answer I suggested to extend JSON response returned from the server with additional data for editoptions.value of the columns having formatter: "select". I suggest to set the beforeProcessing. For example one can generate the server response in the following format:

    {
        "cityMap": {"11": "Chennai", "12": "Mumbai", "13": "Delhi"},
        "rows": [
            { "SID": "1",  "SNAME": "ABC", "CITY": "11" },
            { "SID": "2",  "SNAME": "XYZ", "CITY": "12" },
            { "SID": "3",  "SNAME": "ACX", "CITY": "13" },
            { "SID": "4",  "SNAME": "KHG", "CITY": "13" },
            { "SID": "5",  "SNAME": "ADF", "CITY": "12" },
            { "SID": "6",  "SNAME": "KKR", "CITY": "11" }
        ]
    }
    

    and uses the following jqGrid options

    colModel: [
        {name: "SNAME", width: 250},
        {name: "CITY", width: 180, align: "center"}
    ],
    beforeProcessing: function (response) {
        var $self = $(this);
        $self.jqGrid("setColProp", "CITY", {
            formatter: "select",
            edittype: "select",
            editoptions: {
                value: $.isPlainObject(response.cityMap) ? response.cityMap : []
            }
        });
    },
    jsonReader: { id: "SID"}
    

    The demo demonstrates the approach. It displays

    enter image description here

    One can use the same approach to set any column options dynamically. For example one can use

    {
        "colModelOptions": {
            "CITY": {
                "formatter": "select",
                "edittype": "select",
                "editoptions": {
                    "value": "11:Chennai;13:Delhi;12:Mumbai"
                },
                "stype": "select",
                "searchoptions": {
                    "sopt": [ "eq", "ne" ],
                    "value": ":Any;11:Chennai;13:Delhi;12:Mumbai"
                }
            }
        },
        "rows": [
            { "SID": "1",  "SNAME": "ABC", "CITY": "11" },
            { "SID": "2",  "SNAME": "XYZ", "CITY": "12" },
            { "SID": "3",  "SNAME": "ACX", "CITY": "13" },
            { "SID": "4",  "SNAME": "KHG", "CITY": "13" },
            { "SID": "5",  "SNAME": "ADF", "CITY": "12" },
            { "SID": "6",  "SNAME": "KKR", "CITY": "11" }
        ]
    }
    

    and the following JavaScript code

    var filterToolbarOptions = {defaultSearch: "cn", stringResult: true, searchOperators: true},
        removeAnyOption = function ($form) {
            var $self = $(this), $selects = $form.find("select.input-elm");
            $selects.each(function () {
                $(this).find("option[value='']").remove();
            });
            return true; // for beforeShowSearch only
        },
        $grid = $("#list");
    
    $.extend($.jgrid.search, {
        closeAfterSearch: true,
        closeAfterReset: true,
        overlay: 0,
        recreateForm: true,
        closeOnEscape: true,
        afterChange: removeAnyOption,
        beforeShowSearch: removeAnyOption
    });
    
    $grid.jqGrid({
        colModel: [
            {name: "SNAME", width: 250},
            {name: "CITY", width: 180, align: "center"}
        ],
        beforeProcessing: function (response) {
            var $self = $(this), options = response.colModelOptions, p,
                needRecreateSearchingToolbar = false;
            if (options != null) {
                for (p in options) {
                    if (options.hasOwnProperty(p)) {
                        $self.jqGrid("setColProp", p, options[p]);
                        if (this.ftoolbar) { // filter toolbar exist
                            needRecreateSearchingToolbar = true;
                        }
                    }
                }
                if (needRecreateSearchingToolbar) {
                    $self.jqGrid("destroyFilterToolbar");
                    $self.jqGrid("filterToolbar", filterToolbarOptions);
                }
            }
        },
        jsonReader: { id: "SID"}
    });
    $grid.jqGrid("navGrid", "#pager", {add: false, edit: false, del: false})
    $grid.jqGrid("filterToolbar", filterToolbarOptions);
    

    The demo uses the above code.

    We recreate the searching filter if any option are changed dynamically. The way allows implement more flexible solutions. For example the server can detect the language preferences of the client (of the web browser) and return formatting options for numbers, dates and so on based on the options. I'm sure that everyone can suggest other interesting scenarios.

    One more remark. If you have too many items in select in (searchoptions.value and editoptions.value) I would recommend you don't use strings instead of objects as the value of searchoptions.value and editoptions.value. It allows you to specify the order of items in the select element.

    If you will have too many items in select (for example all cities of your country) then you can consider to use select2 plugin which usage I demonstrate in the answer. It simplify selection of options because it convert select in element which is very close to jQuery UI Autocomplete.

    The next demo demonstrate the usage of select2 plugin. If one click on the dropdown arrow of "select" element of the searching toolbar or the searching dialog one get additional input filed which can be used for quick searching. If one starts to type some text in the input box (for example "e" on an example on the picture below) the list of options will be reduced to the options having the typed text as substring:

    enter image description here

    I personally find such "select-searching" control very practical.

    By the way I described in the another answer how to set colNames dynamically. In can be used to manage more information from the server side.

    UPDATED: The corresponding controller action Students can be about the following

    public class Student {
       public long SID { get; set; }
       public string SNAME { get; set; }
       public long CITY { get; set; }
    }
    public class City {
        public long CID { get; set; }
        public string CNAME { get; set; }
    }
    ...
    public class HomeController : Controller {
        ...
        public JsonResult Students () {
            var students = new List<Student> {
                    new Student { SID = 1, SNAME = "ABC", CITY = 11 },
                    new Student { SID = 2, SNAME = "ABC", CITY = 12 },
                    new Student { SID = 3, SNAME = "ABC", CITY = 13 },
                    new Student { SID = 4, SNAME = "ABC", CITY = 13 },
                    new Student { SID = 5, SNAME = "ABC", CITY = 12 },
                    new Student { SID = 6, SNAME = "ABC", CITY = 11 }
                };
            var locations = new List<City> {
                    new City { CID = 11, CNAME = "Chennai"},
                    new City { CID = 12, CNAME = "Mumbai"},
                    new City { CID = 13, CNAME = "Delhi"}
                };
            // sort and concatinate location corresponds to jqGrid editoptions.value format
            var sortedLocations = locations.OrderBy(location => location.CNAME);
            var sbLocations = new StringBuilder();
            foreach (var sortedLocation in sortedLocations) {
                sbLocations.Append(sortedLocation.CID);
                sbLocations.Append(':');
                sbLocations.Append(sortedLocation.CNAME);
                sbLocations.Append(';');
            }
            if (sbLocations.Length > 0)
                sbLocations.Length -= 1; // remove last ';'
            return Json(new {
                       colModelOptions = new {
                           CITY = new {
                               formatter = "select",
                               edittype = "select",
                               editoptions = new {
                                   value = sbLocations.ToString()
                               },
                               stype = "select",
                               searchoptions = new {
                                   sopt = new[] { "eq", "ne" },
                                   value = ":Any;" + sbLocations
                               }
                           }
                       },
                       rows = students    
                   },
                   JsonRequestBehavior.AllowGet);
        }
    }
    
    0 讨论(0)
提交回复
热议问题