2013-06-03 18 views
16

Chcę móc wypchnąć liczbę rekordów z mojej siatki Kendo po przeczytaniu (odśwież).Zdobądź liczbę rekordów w Kendo Grid po dataSource.read

Oto moje Kendo Grid:

@(Html.Kendo().Grid(Model) 
     .Name("SearchWindowGrid") 
     .Columns(columns => 
      { 
       columns.Bound(p => p.SYSTEM_ITEMS_SEGMENT1).Hidden(); 
      }) 
     .ClientRowTemplate(
      "<tr>" + 
      "<td>" + 
       "<span><b>#: SYSTEM_ITEMS_SEGMENT1#</b></span>&nbsp;<br/>" + 
       "<span>#: DESCRIPTION# </span>" + 
      "</td>" + 
      "</tr>" 
    ) 
     .DataSource(dataSource => dataSource 
     .Ajax() 
     .Read(read => read.Action("PopulateSearchWindow", "Item").Data("additionalSearchWindowInfo")) 
     .Events(ev => ev.Error("onErrorSearchWindow")) 
    ) 
     .Selectable(s => s.Enabled(true).Mode(GridSelectionMode.Single).Type(GridSelectionType.Row)) 
     .Scrollable(s => s.Enabled(true).Height(450)) 
) 

mojego kontrolera działanie:

public ActionResult PopulateSearchWindow([DataSourceRequest] DataSourceRequest request, string option, string searchText, string searchDesc) 
    { 
     try 
     { 
      var derps= _idg.SearchItems(searchText, searchDesc, _adg.OrganizationCode).ToList(); 

      return Json(derps.ToDataSourceResult(request, ModelState)); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("ExceptionErrors", e.Message); 
      return Json(new List<Derp>().ToDataSourceResult(request, ModelState)); 
     } 
    } 

Oto moja funkcja, która wymusza odświeżanie danych:

function refreshData(){ 
     $("#SearchWindowGrid").data("kendoGrid").dataSource.read(); 
     //TODO: get the total count and push to #countElement 
     var count = $("#SearchWindowGrid").data("kendoGrid").length; //not sure what to do here 
     $("#countElement").val(count); 
    } 

Gdzie umieszczam moje TODO w funkcji jQuery Chcę móc uzyskać liczbę wierszy i wypchnąć tę liczbę do konkretnego elemnt na mojej stronie.

Odpowiedz

33

Według interfejsu API here

źródła danych ma funkcję całkowity(). Więc powinieneś być w stanie wykonać następujące czynności, w teorii:

function refreshData(){ 
     var grid = $("#SearchWindowGrid").data("kendoGrid"); 
     grid.dataSource.read(); 
     var count = grid.dataSource.total(); 
     $("#countElement").val(count); 
    } 
+0

Dziękuję za odpowiedź @Quinton Bernhardt. Funkcja fetch() mi umykała, ale ta referencja, którą mi wyślesz, załatwiła sprawę. Jeszcze raz :) – gardarvalur

+2

var searchWindowSource = $ ("# SearchWindowGrid") .danych ("kendoGrid"). DataSource; searchWindowSource.fetch (function() { var total = searchWindowSource.total(); }); – gardarvalur

+0

'total()' działa nawet z filtrem. Jeśli 'filter' zostanie zastosowany w siatce' dataSource', to również da nam liczbę przefiltrowanych rekordów. – Paritosh

9

Okazało się, że kiedy zażądać .total() po .read() funkcjonować siatka nie byłoby naprawdę odświeżony, nawet jeśli zadzwonisz .refresh() zaraz po funkcji odczytu. Poprzez zdefiniowanie zdarzenia zmiany dodaje stałaby się całkowitą bardziej elegancki i precyzyjny:

@(Html.Kendo().Grid(Model) 
    .Name("SearchWindowGrid") 
    ...  
.DataSource(dataSource => dataSource 
    .Ajax() 
    .Read(read => read.Action("PopulateSearchWindow", "Item").Data("additionalSearchWindowInfo")) 
    .Events(ev => ev.Error("onErrorSearchWindow").Change("OnGridChange")) 
) 
) 

z następujących scenariuszy:

function refreshData(){ 
    var grid = $("#SearchWindowGrid").data("kendoGrid"); 
    grid.dataSource.read(); 
    grid.refresh(); 
} 

function OnGridChange() { 
    var grid = $("#SearchWindowGrid").data("kendoGrid"); 
    var count = grid.dataSource.total(); 
    $("#countElement").val(count); 
} 
+0

Dziękuję za to @Shadi, to byłby dokładniejszy sposób wykorzystania zdarzeń z samej siatki. W rzeczywistości uważam, że w końcu użyłem funkcji odświeżania podczas implementacji tej odpowiedzi, ponieważ miałem trudności z odświeżaniem danych. – gardarvalur

0

gardarvalur kod działa zbyt dobrze:

var gridElements = $("#MyGri").data("kendoGrid").dataSource; 
gridElements.fetch(function() 
{var total = gridElements.total(); }) 
Powiązane problemy