2010-01-21 3 views
20

Мне интересно, как я могу вызвать reloadGrid после встроенного редактирования строки.jqgrid reload grid после успешного встроенного обновления/встроенного создания записи

<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"); 
    } 

Я создал уже метод перезагрузки, но я не уверен, куда поместить его в Я попробовал:.

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

, но это уже вызывается, когда пользователь щелкает в ряд. Приведенный выше код позволяет пользователю щелкнуть по строке и при нажатии введите данные, и запись будет обновлена ​​или создана.

После того, как пользователь создал новый объект, мне нужно перезагрузить сетку, так как мне нужен идентификатор объекта только что созданного объекта, чтобы позаботиться о дальнейшем редактировании этой строки.

Edit: Решение:

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; 
       } 
       } 
      }, 

Update: Для дальнейшего использования. Все пользователи, начинающие с сетки js, также могут посмотреть на Slickgrid, поскольку я переключился с jqgrid на slickgrid и могу только рекомендовать его.

+0

Ваше окончательное решение: решение мне очень помогло. Спасибо за включение. – Tareq

+1

Я не могу заставить вышеуказанный код работать, он дает мне TypeError: jQuery («# tnc-list»). JqGrid («saveRow», row_id) .editRow не является функцией – Marvzz

+0

Не работает для меня, прокрутите вниз, там работает код – ymakux

ответ

37

Синтаксис функции 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.

В вашем случае, если вы хотите, чтобы сеть перегружается после того, как строка сохраняется вызов метода editRow следует читать следующим образом.

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

я поручил ваш Reload функции, которая перегружает сетку для 'aftersavefunc параметра'

сам метод перезагрузки должен быть определен следующим образом

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

На самом деле все ответы помогли мне решить мою проблему. Но этот ответ, я думаю, заставляет меня взглянуть в правильном направлении в лучшем случае. См. Мой код решения в части редактирования моего вопроса. Благодарю. –

+0

Отлично. Это было правильное решение. – Tareq

+1

Где я могу положить jQuery ('# grid'). JqGrid ("editRow", id, true, '', '', '', '', reload) – Marvzz

0

Посмотрите на метод saveRow:

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

, который определяет два обратного вызова (successfuncs, aftersavefunc), которая будет вызвана, когда запрос успешно завершен, и после того, как данные были сохранены соответственно.

+1

да, но где я должен поставить эту функцию? Я думаю, что мне нужно вставить его в одно из этих событий: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:cell_editing .. но будет ли послеSubmitCell, afterEditCell или afterSaveCell пожар после отправки обновления ячейки на url: editurl: "{% url set_hour_record_json_set%}" –

0

Из документов, я думаю, afterSaveCell будет работать лучше для вас (afterSubmitCell может работать хорошо, но это, кажется, требует конкретного возвращаемого значения. afterEditCell происходит до того, как удар сервера происходит так, что будет слишком рано).

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"); 
} 

Однако перезагрузка всей сетки, вероятно, будет чрезмерной, учитывая информацию, которую вы описали до сих пор. Если на стороне сервера не обрабатывается поданная информация (это означает, что данные в db могут отличаться после сохранения), перезагрузка после простого редактирования кажется мне пустой тратой времени.

Что касается того, когда вы создаете новую строку, опять же, если нет только перехвата данных на стороне сервера, похоже, было бы проще просто получить новый идентификатор из submit, а затем внести это индивидуальное изменение в jqGrid. Однако, в конце концов, это зависит от того, сколько времени займет перезагрузка всей таблицы.

+0

Спасибо .. это звучит разумно, но что-то не работает. Перезагрузка не запускается. Почему вы помещаете jQuery ('# grid'). JqGrid ('editRow', id, true, reload); в начале? Когда я помещаю это в начало моей сетки, ничего не работает. Но в любом случае .. получение нового идентификатора из submit - это именно то, чего я хочу достичь. Возможно, мое описание немного вводило в заблуждение. Вы знаете, как я могу получить новый идентификатор db из submit и поместить его в jqgrid-row hour_record_pk? –

+0

Вы должны знать, что мой стол состоит из hour_records, просмотренных в течение месяца. Но только там, где существует запись часа на определенную дату, соответствующая строка имеет идентификатор db из базы данных (представлена ​​в столбце hour_record_pk). Когда я редактирую строку, у которой нет идентификатора, новые значения передаются в db и создается новая запись часа. Затем мне нужно либо перезагрузить сетку, чтобы получить идентификатор db, либо получить какой-то новый идентификатор db из submit. В противном случае я получаю проблему, если пользователь хочет изменить вновь созданную запись часа, так как я не знаю на стороне сервера, чью запись часа изменить. –

3

Попробуйте

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

// 

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


// 
0

Ок, теперь решение для копирования-пасты, которое работает хотя бы для меня

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"); 
    } 
Смежные вопросы