web-dev-qa-db-fra.com

Obtenir le nombre d'enregistrements dans Kendo Grid après dataSource.read

Je veux être capable de pousser le nombre d'enregistrements de ma grille de Kendo après lecture (rafraîchissement).

Voici ma grille de Kendo:

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

Action de mon contrôleur:

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

Voici ma fonction qui force l'actualisation des données:

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

Où je mets mon TODO dans la fonction jQuery Je veux pouvoir obtenir le nombre de lignes et pousser ce nombre dans un élément spécifique sur ma page.

17
gardarvalur

Selon la référence API ici

la source de données a une fonction total (). Donc, vous devriez pouvoir faire ce qui suit, en théorie:

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

J'ai trouvé que lorsque vous demandez le .total () après une fonction .read (), la grille ne serait pas vraiment actualisée, même si vous appelez .refresh () juste après la fonction de lecture. En définissant un événement de changement, les éléments suivants permettraient d'obtenir le total plus élégant et précis:

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

avec les scripts suivants:

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

Le code gardarvalur / fonctionne également très bien:

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