jqGrid cu inlineNav: există o metodă de forțare a butonului Adăugare pentru a reactiva?

Folosesc jqGrid 4.3.2 cu opțiunea inlineNav . Toate editările pe grilă se efectuează local folosind loadonce: true și clientArray . Când utilizatorul termină editarea, ele fac clic pe un buton de salvare din formular și întreaga rețea este postată pe server. Acest lucru funcționează foarte bine, în cea mai mare parte, dar am dat peste o ciudățenie. Dacă utilizatorul adaugă un rând nou și apoi face clic pe butonul de salvare înainte de a apăsa pe Enter pentru a confirma modificarea sau deselectarea rândului nou adăugat, butonul de adăugare din navigatorul inline rămâne dezactivat chiar și după ce a sunat saveRow reîncărcare. Am încercat resetSelection și restoreRow după apelul saveRow , dar nici unul dintre acestea nu funcționează. Codul meu de salvare:

$("#submitButton").click(function() {
    $("#theGrid").jqGrid('saveRow', $("#selectedRowId").val(), false, 'clientArray');
    if (!ValidateGridData())
        return false;
    var rowData = $("#theGrid").jqGrid('getRowData');
    var dataToSend = JSON.stringify(rowData);
    $.ajax({
        url: '@Url.Action("UpdateGridData")',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: dataToSend,
        dataType: 'json',
        async: false,
        success: function (data, textStatus, jqXHR) {
            $("#theGrid").jqGrid('setGridParam', { datatype: 'json' });
            $("#theGrid").trigger('reloadGrid');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Error saving data: ' + textStatus + " " + errorThrown);
        }
    });
    return true;
});

Există o modalitate prin care pot convinge navigatorul inline că noul rând este salvat și că utilizatorul poate adăuga mai multe rânduri?

0

1 răspunsuri

Butoanele adăugate în navigator prin metoda inlineNav are ID-uri care au construit din id-ul grilei și sufixul corespunzător:

  • Adăugați: gridId + "_iladd" (de exemplu "list_iladd")
  • Editați: gridId + "_iledit" (de exemplu "list_iledit")
  • Salvați: gridId + "_ilsave" (de exemplu "list_ilsave")
  • Anulează: gridId + "_ilcancel" (de exemplu "list_ilcancel")

Pentru a activa butonul trebuie să eliminați clasa 'ui-state-disabled' CSS:

var gridId = "list";
$("#" + gridId + "list_iladd").removeClass('ui-state-disabled');

Pentru a dezactiva butonul, se poate folosi în loc de .addClass ("ui-state-disabled") .

În plus, nu vă recomandăm să utilizați direct metode de editare inline, cum ar fi saveRow . În cazul în care probabil că nu veți avea problema pe care încercați să o rezolvați. Priviți codul de la răspunsul . Acesta definește editingRowId și myEditParam ca

var $grid = jQuery("#list"),
    editingRowId,
    myEditParam = {
        keys: true,
        oneditfunc: function (id) { editingRowId = id; },
        afterrestorefunc: function (id) { editingRowId = undefined; }
    };

și apoi folosiți inlineNav cu parametrul myEditParam :

$grid.jqGrid('inlineNav', '#pager',
    { edit: true, add: true, editParams: myEditParam,
        addParams: {addRowParams: myEditParam } });

În cazul în care puteți fi siguri că editingRowId vă obține idul rândului curent de editare sau undefined dacă nu se editează niciun rând. Deci, puteți folosi $ (gridIdSelector + "_iledit"). Click (); în loc de editRow pentru a edita rândul curent selectat. În același timp, puteți utiliza setSelection dacă este necesar și simulați clic pe oricare alt buton navigator de editare inline.

UPDATED: If you need you can still combine calls of saveRow inside of onSelectRow, but you can first use the variable editingRowId and seconds use myEditParam which will be common for all editing ways which you use:

onSelectRow: function (id) {
    var $this = $(this);
    if (editingRowId !== id) {
        if (editingRowId) {
           //save or restore currently editing row
            $this.jqGrid("saveRow", editingRowId, myEditParam);
           //or $this.jqGrid("restoreRow", editingRowId, myEditParam);
        }
        $this.jqGrid("editRow", editingRowId, myEditParam);
    }
}

Dacă aveți nevoie de alte opțiuni de metode de editare inline, puteți include acolo în myEditParam . Veți vedea că editingRowId este mult mai bine de utilizat ca variabila lastSel pe care o găsiți în cele mai inovatoare exemple de editare.

0
adăugat
Tocmai m-am îndreptat pe acea cale, cu excepția faptului că am folosit replace pe attr ('class') în loc de .removeClass . Funcționează perfect. Mulțumiri!
adăugat autor AJ., sursa
Oleg, am trecut peste comentariile tale suplimentare despre faptul că nu foloseam direct saveRow. Am folosit onSelectRow pentru a apela saveRow pe rândul selectat anterior, similar codului din stackoverflow.com/q/2359011/27457" ;. Nu vă recomandați să utilizați această abordare?
adăugat autor AJ., sursa
@ AJ .: Sunteți bineveniți!
adăugat autor Oleg, sursa
@AJ: Înțeleg ce vrei să spui. Cred că în cazul în care puteți încă să combinați combinația editare inline cu alte metode de editare inline și nu veți avea probleme dacă urmați câteva reguli suplimentare: vedeți partea UPDATED raspunsul meu.
adăugat autor Oleg, sursa