2010-01-21 17 views
20

Zastanawiam się, jak mogę wyzwolić reloadGrid po inline edycji wiersza.jqgrid przeładowanie siatki po pomyślnej aktualizacji inline/inline tworzenie rekordu

<script type="text/javascript"> 

    jQuery(document).ready(function(){ 
     var lastcell; 
     jQuery("#grid").jqGrid({ 
      url:'{{ json_data_handler }}?year={{ get_param_year }}&month={{ get_param_month }}&project_id={{ get_param_project_id }}', 
      datatype: "json", 
      mtype: 'GET', 
      colNames:['hour_record_pk', 'project_pk', 'weekday', 'date', 'sum', 'description'], 
      colModel:[ 
        {name:'hour_record_pk',index:'hour_record_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}}, 
        {name:'project_pk',index:'project_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}}, 
        {name:'weekday',index:'weekday', width:300, editable:false, sortable:false}, 
        {name:'date_str',index:'date_str', width:300, editable:true, sortable:false, editoptions:{readonly:true}}, 
        {name:'sum',index:'sum', width:100, editable:true, sortable:true,editrules:{number:true,minValue:0,maxValue:24,required:true}}, 
        {name:'description',index:'description', width:600, editable:true, sortable:false,}, 
       ], 
     jsonReader : { 
       repeatitems:false 
     }, 
      rowNum:31, 
      rowList:[10,20,31], 
      //pager: jQuery('#gridpager'), 
      sortname: 'id', 
      viewrecords: true, 
      sortorder: "asc", 
      width: 800, 
      height: 750, 
      caption:"Hour Record Overview", 
      reloadAfterEdit: true, //seems to have no effect 
      reloadAfterSubmit: true, //seems to have no effect 
      onSelectRow: function(id){  
       if(id && id!==lastcell){ 
        jQuery('#grid').jqGrid('restoreRow',lastcell); 
        jQuery('#grid').jqGrid('editRow',id,true); 
        lastcell=id; 
        } 
       }, 
      editurl:"{% url set_hour_record_json_set %}" 
    }).navGrid('#gridpager'); 
    }); 

function reload(result) { 
    $("#grid").trigger("reloadGrid"); 
    } 

stworzyłem już metodę reload, ale nie jestem pewien gdzie umieścić go próbowałem.

jQuery('#grid').jqGrid('editRow',id,true,reload()); 

ale to już jest wywoływana, gdy użytkownik kliknie na rząd. Powyższy kod umożliwia użytkownikowi kliknięcie w wiersz i naciśnięcie klawisza enter powoduje przesłanie danych i aktualizację lub utworzenie rekordu.

Po utworzeniu przez użytkownika nowego obiektu muszę przeładować siatkę, ponieważ potrzebuję identyfikatora obiektu nowo utworzonego obiektu, aby zająć się dalszą edycją tego wiersza.

Edit: Rozwiązanie:

onSelectRow: function(row_id){ 
      if(row_id != null) { 
       if(row_id !== last_selected_row) { 
        jQuery('#grid').jqGrid('restoreRow',last_selected_row); 
        jQuery('#grid').jqGrid('saveRow',row_id) 
          .editRow(row_id, true,false,reload); 
        last_selected_row = row_id; 
       } else { 
        last_selected_row=row_id; 
       } 
       } 
      }, 

Aktualizacja: Do wykorzystania w przyszłości. Wszyscy użytkownicy zaczynający od siatek js mogą również przejrzeć Slickgrid po przełączeniu z jqgrid na slickgrid i mogę go tylko polecić.

+0

Twoja ostatnia edycja: rozwiązanie bardzo mi pomogło. Dzięki za uwzględnienie. – Tareq

+1

Nie mogę zrobić powyższego kodu do pracy, to daje mi TypeError: jQuery ("# ​​tnc-list"). JqGrid ("saveRow", row_id) .editRow nie jest funkcją – Marvzz

+0

Nie działa dla mnie, przewiń w dół działa kod – ymakux

Odpowiedz

37

Oto składnia funkcji editRow

jQuery("#grid_id").jqGrid('editRow', rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc); 

oneditfunc: fires after successfully accessing the row for editing, prior to allowing user access to the input fields. The row's id is passed as a parameter to this function.

succesfunc: if defined, this function is called immediately after the request is successful. This function is passed the data returned from the server. Depending on the data from server; this function should return true or false.

aftersavefunc: if defined, this function is called after the data is saved to the server. Parameters passed to this function are the rowid and the response from the server request.

W twoim przypadku, jeśli chcesz siatki przeładowywane po wierszu jest zapisana wywołanie metody editRow powinien brzmieć następująco.

jQuery('#grid').jqGrid("editRow", id, true, '', '', '', '', reload) 

mam przypisanych Reload funkcję, która ładuje się siatkę dla 'aftersavefunc' parametru

sama metoda przeładowanie powinny być zdefiniowane następująco

function reload(rowid, result) { 
    $("#grid").trigger("reloadGrid"); 
} 
+0

Właściwie wszystkie odpowiedzi pomogły mi rozwiązać mój problem. Ale ta odpowiedź wydaje mi się, żebym spojrzał we właściwym kierunku co najwyżej. Zobacz mój kod rozwiązania w części edycji mojego pytania. Dzięki. –

+0

Doskonały. To było właściwe rozwiązanie. – Tareq

+1

Gdzie umieścić jQuery ("# ​​grid"). JqGrid ("editRow", id, true, "", "", "", ", załaduj ponownie) – Marvzz

0

Wystarczy popatrzeć na metodzie saveRow:

saveRow (rowid, succesfunc, url, extraparam, aftersavefunc, onerrorfunc)

który definiuje dwa zwrotnego (successfuncs, aftersavefunc), aby zostać wywołana, gdy wniosek zostanie pomyślnie zakończona i po dane zostały zapisane odpowiednio.

+1

tak, ale gdzie muszę umieścić tę funkcję? Myślę, że muszę wstawić go do jednego z tych wydarzeń: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:cell_editing .., ale czy afterSubmitCell, afterEditCell lub afterSaveCell strzelają po wysłaniu aktualizacji komórki do adresu URL: editurl: "{% url set_hour_record_json_set%}" –

0

Od docs, myślę afterSaveCell będzie najlepsze dla Ciebie (afterSubmitCell może działać jak dobrze, ale wydaje się, że wymagają szczególnej wartości zwracanej. afterEditCell dzieje przed hitem serwer występuje tak, że będzie zbyt szybko).

jQuery('#grid').jqGrid('editRow', id, true, reload); 

jQuery(document).ready(function(){ 
    var lastcell; 
    jQuery("#grid").jqGrid({ 

     // [snip earlier config] 

     onSelectRow: function(id){  
      if(id && id!==lastcell){ 
       jQuery('#grid').jqGrid('restoreRow',lastcell); 
       jQuery('#grid').jqGrid('editRow',id,true); 
       lastcell=id; 
       } 
      }, 
     editurl:"{% url set_hour_record_json_set %}", 
     onAfterSaveCell: reload 
    }).navGrid('#gridpager'); 
}); 

function reload(result) { 
    $("#grid").trigger("reloadGrid"); 
} 

Jednak ponowne załadowanie całej siatki jest prawdopodobnie przesadą, biorąc pod uwagę informacje, które do tej pory opisałeś. O ile nie ma przetwarzania przetworzonych danych po stronie serwera (co oznacza, że ​​dane w bazie danych mogą się różnić po zapisie), ponowne załadowanie po prostej edycji wydaje mi się stratą czasu.

Co do tego, kiedy tworzysz nowy wiersz, znowu, jeśli nie ma maczania danych tylko po stronie serwera, wydaje się, że łatwiej byłoby po prostu pobrać nowy identyfikator z przesyłki, a następnie dokonać indywidualnej zmiany w jqGrid. Ostatecznie jednak zależy to od tego, ile czasu zajmie przeładowanie całego stołu.

+0

Dzięki .. to brzmi rozsądnie, ale coś nie działa. Przeładowanie nie jest wyzwalane. Dlaczego umieszczasz jQuery ('# grid'). JqGrid ('editRow', id, true, reload); na początku? Kiedy umieszczam to na początku mojej siatki nic nie działa. Ale w każdym razie ... uzyskanie nowego identyfikatora z zgłoszenia jest dokładnie tym, co chcę osiągnąć. Może mój opis był trochę mylący. Czy wiesz, w jaki sposób mogę uzyskać nowy identyfikator db z przesłanego i umieścić go w jqgrid-wiersz hour_record_pk? –

+0

Musisz wiedzieć, że mój stół składa się z hour_records oglądanych przez miesiąc. Ale tylko w przypadku, gdy rekord godziny istnieje dla określonej daty, odpowiedni wiersz ma identyfikator bazy danych (przedstawiony w kolumnie hour_record_pk). Kiedy edytuję wiersz, który nie ma identyfikatora, nowe wartości są przesyłane do bazy danych i tworzy nowy rekord godziny. Następnie potrzebuję albo przeładowania sieci, aby uzyskać identyfikator bazy danych, albo otrzymam w jakiś sposób nowy identyfikator db z przesłanego. W przeciwnym razie pojawi się problem, jeśli użytkownik chce zmienić nowo utworzony rekord godziny, ponieważ nie wiem na stronie, który rekord godziny zmienić. –

3

Spróbuj

 $("#grid").jqGrid('editRow', rowid, true, null, null, null, {}, aftersavefunc); 

// 

     function aftersavefunc(rowid, result) { 
     $("#grid").trigger("reloadGrid"); 
    } 


// 
0

Ок, teraz kopiuj-wklej rozwiązanie, które działa przynajmniej dla mnie

onSelectRow: function(id){ 
    $('#grid').jqGrid("editRow", id, true, '', '', '', '', reloadTable); 
}, 
// more confir 

// reload table after submit. Put it somewhere in your JS file 
    function reloadTable(result) { 
    $('#grid').trigger("reloadGrid"); 
    } 
Powiązane problemy