2012-11-28 8 views

Odpowiedz

46

Jak zdefiniować wiersz, który chcesz zaktualizować? Zakładam, że jest to wiersz, który wybrałeś, a nazwa aktualizowanej kolumny to symbol.

// Get a reference to the grid 
var grid = $("#my_grid").data("kendoGrid"); 

// Access the row that is selected 
var select = grid.select(); 
// and now the data 
var data = grid.dataItem(select); 
// update the column `symbol` and set its value to `HPQ` 
data.set("symbol", "HPQ"); 

Pamiętaj, że treść DataSource jest obiektem observable, co oznacza, że ​​można go zaktualizować za pomocą set i zmiany powinny znaleźć odzwierciedlenie magicznie w grid.

+4

Co powinniśmy zrobić, jeśli jest to niestandardowy szablon w komórce, który nie jest edytowalny, a szablon wywołuje funkcję. Zestaw wywołań w elemencie danych nie wydaje się przerysowywać szablonu. – jonperl

+0

@jonperl Proponuję zadać to jako inne pytanie, aby upewnić się, że inni niż ja to widzą i mają możliwość odpowiedzi. W każdym razie próbowałem go z szablonami i działało. Opublikuj kod, pokazujący, co próbujesz i pokazując, co się nie udaje. – OnaBai

+0

UWAGA: 'kendoDataGrid' jest teraz nazywane "kendoGrid" (lub może zawsze było) –

26

data.set odświeży całą sieć i wyśle ​​w niektórych przypadkach zdarzenie databound. Jest to bardzo powolne i niepotrzebne. Spowoduje to również zwinięcie dowolnych rozszerzonych szablonów szczegółów, które nie są idealne.

Polecam użyć tej funkcji, którą napisałem, aby zaktualizować pojedynczy wiersz w siatce kendo.

// Updates a single row in a kendo grid without firing a databound event. 
// This is needed since otherwise the entire grid will be redrawn. 
function kendoFastRedrawRow(grid, row) { 
    var dataItem = grid.dataItem(row); 

    var rowChildren = $(row).children('td[role="gridcell"]'); 

    for (var i = 0; i < grid.columns.length; i++) { 

     var column = grid.columns[i]; 
     var template = column.template; 
     var cell = rowChildren.eq(i); 

     if (template !== undefined) { 
      var kendoTemplate = kendo.template(template); 

      // Render using template 
      cell.html(kendoTemplate(dataItem)); 
     } else { 
      var fieldValue = dataItem[column.field]; 

      var format = column.format; 
      var values = column.values; 

      if (values !== undefined && values != null) { 
       // use the text value mappings (for enums) 
       for (var j = 0; j < values.length; j++) { 
        var value = values[j]; 
        if (value.value == fieldValue) { 
         cell.html(value.text); 
         break; 
        } 
       } 
      } else if (format !== undefined) { 
       // use the format 
       cell.html(kendo.format(format, fieldValue)); 
      } else { 
       // Just dump the plain old value 
       cell.html(fieldValue); 
      } 
     } 
    } 
} 

Przykład:

// Get a reference to the grid 
var grid = $("#my_grid").data("kendoGrid"); 

// Access the row that is selected 
var select = grid.select(); 
// and now the data 
var data = grid.dataItem(select); 

// Update any values that you want to 
data.symbol = newValue; 
data.symbol2 = newValue2; 
... 

// Redraw only the single row in question which needs updating 
kendoFastRedrawRow(grid, select); 

// Then if you want to call your own databound event to do any funky post processing: 
myDataBoundEvent.apply(grid); 
+2

Co zrobić, jeśli nie robisz edycji samej siatki, ale zamiast tego w wyskakującym okienku. Jak określić, który wiersz jest edytowany? – Scott

+0

Dziękujemy! To uratowało mnie z tyłu !!! –

+0

Otrzymuję myDataBoundEvent jest zmienną funkcji w powyższym fragmencie kodu. Ale jaki kod faktycznie wchodzi w tę funkcję? Czy istnieje na żywo przykład tego, na co mogę spojrzeć? Obecnie mam kod powyżej bez wywoływania żądania po wywołaniu inwokacji metody kendoFastRedrawRow i widzę obracające się koło, sugerujące, że przeglądarka wciąż czeka na coś. Jakieś wskazówki? – Sudhir

3

znalazłem sposób, aby zaktualizować źródła danych siatki i show w sieci bez odświeżania całej sieci. Na przykład masz wybrany wiersz i chcesz zmienić wartość kolumny "nazwa".

//the grid 
var grid = $('#myGrid').data('kendoGrid');  
// Access the row that is selected 
var row = grid.select(); 
//gets the dataItem 
var dataItem = grid.dataItem(row); 
//sets the dataItem 
dataItem.name = 'Joe'; 
//generate a new row html 
var rowHtml = grid.rowTemplate(dataItem); 
//replace your old row html with the updated one 
row.replaceWith(rowHtml); 
Powiązane problemy