2013-06-03 8 views
16

Tôi muốn có thể đẩy số bản ghi từ lưới Kendo của tôi sau khi đọc (làm mới).Nhận số bản ghi trong Kendo Grid sau khi dataSource.read

Đây là Kendo Lưới của tôi:

@(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)) 
) 

My điều khiển hành động:

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

Đây là chức năng của tôi buộc làm mới dữ liệu:

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

Nơi tôi đặt TODO của mình trong hàm jQuery tôi muốn có thể nhận được số hàng và đẩy số đó vào một gợi ý cụ thể trên trang của tôi.

Trả lời

33

Theo API tham khảo here

các nguồn dữ liệu có chức năng tổng(). Vì vậy, bạn có thể thực hiện những điều sau đây, theo lý thuyết:

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

Cảm ơn câu trả lời của bạn @Quinton Bernhardt. Hàm fetch() đã lẩn tránh tôi nhưng tham chiếu mà bạn gửi cho tôi đã thực hiện thủ thuật. Thanx lần nữa :) – gardarvalur

+2

var searchWindowSource = $ ("# SearchWindowGrid"). Data ("kendoGrid"). DataSource; tìm kiếmWindowSource.fetch (function() { var total = searchWindowSource.total(); }); – gardarvalur

+0

'total()' hoạt động ngay cả với bộ lọc. Nếu 'filter' được áp dụng trên lưới' dataSource', thì nó cũng cho chúng ta số lượng các bản ghi đã lọc. – Paritosh

9

Tôi thấy rằng khi bạn yêu cầu .total() sau hàm .read() lưới sẽ không thực sự được làm mới, ngay cả khi bạn gọi .refresh() ngay sau hàm đọc. Bằng việc xác định một sự kiện thay đổi, sau đây sẽ làm cho việc tổng thanh lịch và chính xác hơn:

@(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")) 
) 
) 

với các kịch bản sau đây:

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

Cảm ơn bạn vì điều đó @Shadi, đó sẽ là cách chính xác hơn khi sử dụng các sự kiện từ chính lưới đó. Trong thực tế, tôi tin rằng cuối cùng tôi đã sử dụng chức năng làm mới khi thực hiện câu trả lời này bởi vì tôi đã gặp khó khăn trong việc làm mới dữ liệu. – gardarvalur

0

Các gardarvalur đang hoạt động tốt quá:

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