title: Kendo Grid - Refresh Row after Edit from Popup
body: <p>I have a Kendo grid that has a column with buttons that bring up a popup for editing a row. Currently after doing an update to the database, I refresh the whole grid. This is too time consuming. I want to just update the grid row being edited with the new values from the popup, assuming the update succeeds. How do I do this?</p>
  
  <p>Edited to Add:</p>
  
  <p>This is from my grid where I set up popup editing.</p>
  
  <pre><code>editable: {
              mode: "popup",
              window: {
                  title: "Add/Edit Generator Inventory" //changes title of the popup window                    
              },
              template: kendo.template($("#divGeneratorInventoryTemplate").html()) //assign custom edit template for item while edit an individual item
          }
  </code></pre>
  
  <p>My Grid: </p>
  
  <pre><code>$("#GeneratorInventoryGrid").kendoGrid(
      {
          columns: [
                      { title: "&lt;input id='chkHeader' class='parentCheckbox' type='checkbox' /&gt;", width: "40px", template: "&lt;input class='childCheckbox' type='checkbox' id='#: GeneratorDetailId #' /&gt;", filterable: false, sortable: false },
                      { field: "GeneratorCode", title: "Generator ID", width: "145px", validation: { required: true }, groupable: false, template: "&lt;a title='Click to Edit' class='k-button k-        button-icontext k-grid-edit' onclick='viewModels.Generator.LoadDropDownlistValue(false);'&gt;#: GeneratorCode #&lt;/a&gt;", filterable: true, sortable: true }, //                                       
                      { field: "Edit", title: "Edit/Delete", width: "200px", groupable: false, template: "&lt;a title='Click to Edit' class='k-button k-button-icontext k-grid-edit'  onclick='viewModels.Generator.LoadDropDownlistValue(false);'&gt;&lt;span class='k-icon k-edit'&gt;&lt;/span&gt;Edit&lt;/a&gt; &amp;nbsp; &lt;a title='Click to Delete' class='k-button k-button-icontext'          onclick='viewModels.Generator.RemoveGeneratorValue(#: GeneratorDetailId # , #: TicketId#, \"#: GeneratorCode #\");' &gt;&lt;span class='k-icon k-delete'&gt;&lt;/span&gt;Delete&lt;/a&gt;", filterable: false, sortable: false }
          ],
          resizable: true,
          scrollable: true,
          groupable: false,
          detailExpand: function (e) { alert('') },
          dataSource: new kendo.data.DataSource({
              transport: {
                  //batch: true,
                  read: function (options) {
                      var uri = '/GeneratorDetail/Active';
                      //var uri = '/GeneratorDetail/All';
  
                      ServiceHelper.getData(uri, function (data) {
                          viewModels.Generator.GeneratorInventory.removeAll();
                          viewModels.Generator.GeneratorInventory(data.Data);
  
                          //viewModels.Generator.GeneratorInventory(viewModels.Generator.FilterActiveInactive(data.Data, 1));
  
                      }, null);
  
  
                      options.success(viewModels.Generator.GeneratorInventory());
                  },
              },
  
              schema: {
                  model: {
                      type: "json",
                      id: "GeneratorDetailId",
                      fields: {
                          GeneratorCode: { type: "string" },
  
                      }
                  }
              },
              sort: {
                  field: "GeneratorCode", dir: "asc"
              },
          }),
          sortable: {
              mode: "multiple",
              allowUnsort: false
          },
          edit: function (e) {
  
  
  
          },
  
          dataBound: function (e) {
              // edited for brevity
          },
          editable: {
              mode: "popup",
              window: {
                  title: "Add/Edit Generator Inventory" //changes title of the popup window                    
              },
              template: kendo.template($("#divGeneratorInventoryTemplate").html()) //assign custom edit template for item while edit an individual item
          },           
          save: function (e) {           
              var url = "";
              if (e.model.GeneratorDetailId == undefined || e.model.GeneratorDetailId == "") //Insert item
              {
                  url = '/GeneratorDetail/Save';
                  ServiceHelper.postData(url, JSON.stringify(saveGeneratorInventoryData), function (data) {
                      if (data == true) {
                          showNotification('Generator Inventory data saved successfully', '');
  
                          // ****** this is what I want to get rid of ************
                          $('#GeneratorInventoryGrid').data('kendoGrid').dataSource.read();
                          $('#GeneratorInventoryGrid').data('kendoGrid').refresh();
  
                      }
                  }, null);
              }
          },
          height: 600,
          width: 200,
          filterMenuInit: function (e) {
              setTimeout(function () {
                  $(".k-animation-container").css("left", "328px");
              }, 10);
          }
      });
  </code></pre>