jqgrid valeurs de l'option de menu déroulant incorrect de select dans la zone d'édition

j'utilise form edit. Il y a deux cases de sélection dans le formulaire. Une boîte de sélection est le pays, une autre boîte de sélection est l'état. La case de sélection de l'état dépend du pays sélectionné et sera remplie dynamiquement. Par exemple:

Pays:

US (option value=1)

royaume-UNI (option value=2)

État pour NOUS:

Alabama (option value=1)

La californie (option value=2)

Floride (valeur de l'option=3)

Hawaï (option value=4)

État pour le royaume-UNI:

Londres (option value=5)

Oxford (option value=6)

<!-Comme vous pouvez le voir ci-dessus, l'id d'État pour le Royaume-Uni commence par 5. Quand j'ai modifier un enregistrement qui contenait Country id=2 (UK) et State id=6 (Oxford), la forme d'édition montre correctement-le pays est UK et L'État est Oxford. Mais si vous laissez tomber vers le bas le texte de l'option est correct (il montre Oxford de Londres) mais la valeur de l'option commencera à 0. Ce qui devrait être correct est que la valeur de l'option devrait commencer à 5.

si vous sélectionnez et modifiez la case country drop down vers nous puis changez à nouveau vers UK, l'option valeur sera générée correctement (commence à partir de 5).

ma question Est, Comment Pouvons-nous remplir la boîte de sélection pour l'état avec la valeur d'option correcte basée sur le pays dans la boîte d'édition quand le formulaire d'édition se charge?

14
demandé sur Matas Vaitkevicius 2010-12-17 13:38:08

2 réponses

la réponse à votre question dépend un peu de la source où vous recevez les informations affichées sous "State for US" et "State for UK". Les deux possibilités sont supportées par jqGrid: 1) l'utilisation de value paramètre editoptions 2) l'usage de dataUrl et buildSelect paramètre editoptions. La première Solution est la meilleure en cas d'édition locale ou si la liste des options possibles est statique. La deuxième choisir être utilisé dans le cas, que les informations sur les États, les pays et les états de certains pays sera obtenu par demande AJAX à partir de la base de données. - Je décrire la solution sur l'exemple de l'utilisation de value paramètre pour n'avoir aucune dépendance aux composants du serveur. La plupart des parties de l'implémentation sont les mêmes dans le cas de l'utilisation de dataUrl et buildSelect.

j'ai fait le live exemple qui démontrent ce dont vous avez besoin.

le problème principal est que l' valueeditoptions sont utilisés une seule fois au moment de l'initialisation. À l'intérieur de dataainit function on peut remplacer le value, mais après le changement de la valeur dans la première boîte select/drop-down avec les pays, la deuxième boîte select/drop-down avec les états doit être reconstruite manuellement. Pour ce faire, il faut comprendre que l'élément HTML select a un id construit à partir de la ligne id '_' et le nom de la colonne: rowId + "_State". En outre, il est important, que l' valueeditoptions doit être réinitialisé à la valeur initiale, de sorte que n'importe quel id d'État puisse être décodé au nom d'état.

voici le code de exemple:

var countries = { '1': 'US', '2': 'UK' };
var states = { '1': 'Alabama', '2': 'California', '3': 'Florida', '4': 'Hawaii', '5': 'London', '6': 'Oxford' };
var statesOfCountry = {
    1: { '1': 'Alabama', '2': 'California', '3': 'Florida', '4': 'Hawaii' },
    2: { '5': 'London', '6': 'Oxford' }
};
var mydata = [
    { id: '0', Country: '1', State: '1', Name: "Louise Fletcher" },
    { id: '1', Country: '1', State: '3', Name: "Jim Morrison" },
    { id: '2', Country: '2', State: '5', Name: "Sherlock Holmes" },
    { id: '3', Country: '2', State: '6', Name: "Oscar Wilde" }
];

var lastSel = -1;
var grid = jQuery("#list");
var resetStatesValues = function () {
    grid.setColProp('State', { editoptions: { value: states} });
};
grid.jqGrid({
    data: mydata,
    datatype: 'local',
    colModel: [
        { name: 'Name', width: 200 },
        { name: 'Country', width: 100, editable: true, formatter: 'select',
            edittype: 'select', editoptions: {
                value: countries,
                dataInit: function (elem) {
                    var v = $(elem).val();
                    // to have short list of options which corresponds to the country
                    // from the row we have to change temporary the column property
                    grid.setColProp('State', { editoptions: { value: statesOfCountry[v]} });
                },
                dataEvents: [
                    {
                        type: 'change',
                        fn: function(e) {
                            // To be able to save the results of the current selection
                            // the value of the column property must contain at least
                            // the current selected 'State'. So we have to reset
                            // the column property to the following
                            //grid.setColProp('State', { editoptions:{value: statesOfCountry[v]} });
                            //grid.setColProp('State', { editoptions: { value: states} });
                            resetStatesValues();

                            // build 'State' options based on the selected 'Country' value
                            var v = parseInt($(e.target).val(), 10);
                            var sc = statesOfCountry[v];
                            var newOptions = '';
                            for (var stateId in sc) {
                                if (sc.hasOwnProperty(stateId)) {
                                    newOptions += '<option role="option" value="' +
                                                  stateId + '">' +
                                                  states[stateId] + '</option>';
                                }
                            }

                            // populate the new
                            if ($(e.target).is('.FormElement')) {
                                // form editing
                                var form = $(e.target).closest('form.FormGrid');
                                $("select#State.FormElement", form[0]).html(newOptions);
                            } else {
                                // inline editing
                                var row = $(e.target).closest('tr.jqgrow');
                                var rowId = row.attr('id');
                                $("select#" + rowId + "_State", row[0]).html(newOptions);
                            }
                        }
                    }
                ]
            }
        },
        {
            name: 'State', width: 100, editable: true, formatter: 'select',
            edittype: 'select', editoptions: { value: states }
        }
    ],
    onSelectRow: function (id) {
        if (id && id !== lastSel) {
            if (lastSel != -1) {
                resetStatesValues();
                grid.restoreRow(lastSel);
            }
            lastSel = id;
        }
    },
    ondblClickRow: function (id, ri, ci) {
        if (id && id !== lastSel) {
            grid.restoreRow(lastSel);
            lastSel = id;
        }
        resetStatesValues();
        grid.editRow(id, true, null, null, 'clientArray', null,
                        function (rowid, response) {  // aftersavefunc
                            grid.setColProp('State', { editoptions: { value: states} });
                        });
        return;
    },
    editurl: 'clientArray',
    sortname: 'Name',
    height: '100%',
    viewrecords: true,
    rownumbers: true,
    sortorder: "desc",
    pager: '#pager',
    caption: "Demonstrate dependend select/dropdown lists (edit on double-click)"
}).jqGrid('navGrid','#pager', 
          { edit: true, add: true, del: false, search: false, refresh: false },
          { // edit options
              recreateForm:true,
              onClose:function() {
                  resetStatesValues();
              }
          },
          { // add options
              recreateForm:true,
              onClose:function() {
                  resetStatesValues();
              }
          });

UPDATED: j'ai mis à jour le code ci-dessus pour qu'il fonctionne aussi en cas d'édition de formulaires. Vous pouvez voir en direct ici. Parce que jqGrid ne supporte pas l'édition locale pour l'édition de formulaires, je n'ai pas pu tester le code. Néanmoins j'espère que j'ai fait la plupart des changements nécessaires.

UPDATED 2: j'ai étendu le code ci-dessus pour supporter

  1. édition en ligne, édition de formulaires, recherche dans la barre D'outils et Recherche Avancée
  2. les boutons de navigation Précédent ou suivant dans la forme d'édition
  3. amélioration de la prise en charge du clavier dans selects (problème de rafraîchissement de Select dépendant dans certains navigateurs sont fixes)

La nouvelle version de la démo est ici. La modification du code de la démo, vous trouverez ci-dessous:

var countries = { '1': 'US', '2': 'UK' },
    //allCountries = {'': 'All', '1': 'US', '2': 'UK'},
    // we use string form of allCountries to have control on the order of items
    allCountries = ':All;1:US;2:UK',
    states = { '1': 'Alabama', '2': 'California', '3': 'Florida', '4': 'Hawaii', '5': 'London', '6': 'Oxford' },
    allStates = ':All;1:Alabama;2:California;3:Florida;4:Hawaii;5:London;6:Oxford',
    statesOfUS = { '1': 'Alabama', '2': 'California', '3': 'Florida', '4': 'Hawaii' },
    statesOfUK = { '5': 'London', '6': 'Oxford' },
    // the next maps contries by ids to states
    statesOfCountry = { '': states, '1': statesOfUS, '2': statesOfUK },
    mydata = [
        { id: '0', country: '1', state: '1', name: "Louise Fletcher" },
        { id: '1', country: '1', state: '3', name: "Jim Morrison" },
        { id: '2', country: '2', state: '5', name: "Sherlock Holmes" },
        { id: '3', country: '2', state: '6', name: "Oscar Wilde" }
    ],
    lastSel = -1,
    grid = $("#list"),
    removeAllOption = function (elem) {
        if (typeof elem === "object" && typeof elem.id === "string" && elem.id.substr(0, 3) !== "gs_") {
            // in the searching bar
            $(elem).find('option[value=""]').remove();
        }
    },
    resetStatesValues = function () {
        // set 'value' property of the editoptions to initial state
        grid.jqGrid('setColProp', 'state', { editoptions: { value: states} });
    },
    setStateValues = function (countryId) {
        // to have short list of options which corresponds to the country
        // from the row we have to change temporary the column property
        grid.jqGrid('setColProp', 'state', { editoptions: { value: statesOfCountry[countryId]} });
    },
    changeStateSelect = function (countryId, countryElem) {
        // build 'state' options based on the selected 'country' value
        var stateId, stateSelect, parentWidth, $row,
            $countryElem = $(countryElem),
            sc = statesOfCountry[countryId],
            isInSearchToolbar = $countryElem.parent().parent().parent().hasClass('ui-search-toolbar'),
                              //$(countryElem).parent().parent().hasClass('ui-th-column')
            newOptions = isInSearchToolbar ? '<option value="">All</option>' : '';

        for (stateId in sc) {
            if (sc.hasOwnProperty(stateId)) {
                newOptions += '<option role="option" value="' + stateId + '">' +
                    states[stateId] + '</option>';
            }
        }

        setStateValues(countryId);

        // populate the subset of contries
        if (isInSearchToolbar) {
            // searching toolbar
            $row = $countryElem.closest('tr.ui-search-toolbar');
            stateSelect = $row.find(">th.ui-th-column select#gs_state");
            parentWidth = stateSelect.parent().width();
            stateSelect.html(newOptions).css({width: parentWidth});
        } else if ($countryElem.is('.FormElement')) {
            // form editing
            $countryElem.closest('form.FormGrid').find("select#state.FormElement").html(newOptions);
        } else {
            // inline editing
            $row = $countryElem.closest('tr.jqgrow');
            $("select#" + $.jgrid.jqID($row.attr('id')) + "_state").html(newOptions);
        }
    },
    editGridRowOptions = {
        recreateForm: true,
        onclickPgButtons: function (whichButton, $form, rowid) {
            var $row = $('#' + $.jgrid.jqID(rowid)), countryId;
            if (whichButton === 'next') {
                $row = $row.next();
            } else if (whichButton === 'prev') {
                $row = $row.prev();
            }
            if ($row.length > 0) {
                countryId = grid.jqGrid('getCell', $row.attr('id'), 'country');
                changeStateSelect(countryId, $("#country")[0]);
            }
        },
        onClose: function () {
            resetStatesValues();
        }
    };

grid.jqGrid({
    data: mydata,
    datatype: 'local',
    colModel: [
        { name: 'name', width: 200, editable: true },
        { name: 'country', width: 100, editable: true, formatter: 'select', stype: 'select', edittype: 'select',
            searchoptions: {
                value: allCountries,
                dataInit: function (elem) { removeAllOption(elem); },
                dataEvents: [
                    { type: 'change', fn: function (e) { changeStateSelect($(e.target).val(), e.target); } },
                    { type: 'keyup', fn: function (e) { $(e.target).trigger('change'); } }
                ]
            },
            editoptions: {
                value: countries,
                dataInit: function (elem) { setStateValues($(elem).val()); },
                dataEvents: [
                    { type: 'change', fn: function (e) { changeStateSelect($(e.target).val(), e.target); } },
                    { type: 'keyup', fn: function (e) { $(e.target).trigger('change'); } }
                ]
            }},
        { name: 'state', width: 100, formatter: 'select', stype: 'select',
            editable: true, edittype: 'select', editoptions: { value: states },
            searchoptions: { value: allStates, dataInit: function (elem) { removeAllOption(elem); } } }
    ],
    onSelectRow: function (id) {
        if (id && id !== lastSel) {
            if (lastSel !== -1) {
                $(this).jqGrid('restoreRow', lastSel);
                resetStatesValues();
            }
            lastSel = id;
        }
    },
    ondblClickRow: function (id) {
        if (id && id !== lastSel) {
            $(this).jqGrid('restoreRow', lastSel);
            lastSel = id;
        }
        resetStatesValues();
        $(this).jqGrid('editRow', id, {
            keys: true,
            aftersavefunc: function () {
                resetStatesValues();
            },
            afterrestorefunc: function () {
                resetStatesValues();
            }
        });
        return;
    },
    editurl: 'clientArray',
    sortname: 'name',
    ignoreCase: true,
    height: '100%',
    viewrecords: true,
    rownumbers: true,
    sortorder: "desc",
    pager: '#pager',
    caption: "Demonstrate dependend select/dropdown lists (inline editing on double-click)"
});
grid.jqGrid('navGrid', '#pager', { del: false }, editGridRowOptions, editGridRowOptions);
grid.jqGrid('filterToolbar', {stringResult: true, searchOnEnter: true, defaultSearch : "cn"});

UPDATED 3: La dernière version du code de la démo, vous trouverez ici.

35
répondu Oleg 2012-11-11 12:55:49

j'utilise form edit. Il y a trois cases de sélection dans le formulaire. Une boîte de sélection est du pays, une boîte de sélection est de la ville,une autre boîte de sélection est la rue. La zone de sélection de la ville dépend du pays sélectionné et sera peuplée dynamiquement. La case street select dépend de la ville sélectionnée et sera peuplée dynamiquement. Je sauve, la ville de la campagne, la rue à MySQL. Si je choisis le pays comment changer la ville choisir la boîte de MySQL de la table

0
répondu Owen 2017-06-09 03:10:57