5

I have kendo grid in asp.net mvc and i use server wrapper.I want Additional column named "Row Number" that is simple counter (1,2,3,...). I want this counter never change by client sorting. Always first row be 1 second row be 2 ,... in column "RowNumber"

how can I do this in kendo grid ?

Lars Höppner
  • 18,252
  • 2
  • 45
  • 73
Behrouz Ghazi
  • 399
  • 2
  • 7
  • 23
  • possible duplicate of [How to add row number to kendo ui grid?](http://stackoverflow.com/questions/17378361/how-to-add-row-number-to-kendo-ui-grid) – Jesse Apr 21 '14 at 03:36

8 Answers8

9

You can use the dataBound event:

$("#grid").kendoGrid({
    sortable: true,
    dataSource: [{
        name: "Jane Doe",
        age: 30
    }, {
        name: "John Doe",
        age: 33
    }],
    columns: [{
        field: "name"
    }, {
        field: "age"
    }, {
        field: "rowNumber",
        title: "Row number",
        template: "<span class='row-number'></span>"
    }],
    dataBound: function () {
        var rows = this.items();
        $(rows).each(function () {
            var index = $(this).index() + 1;
            var rowLabel = $(this).find(".row-number");
            $(rowLabel).html(index);
        });
    }
});

(demo)

Lars Höppner
  • 18,252
  • 2
  • 45
  • 73
7

Other answers are OK but they don't apply pagination effects. So I think better implementation would be:

var grid = $( "#grid" ).kendoGrid( {
    sortable: true,
    dataSource: [ {
        name: "Jane Doe",
        age: 30
    }, {
        name: "John Doe",
        age: 33
    } ],
    pageable: {
        refresh: false,
        pageSizes: true,
        pageSize: 10,
    },
    columns: [ {
        field: "name"
    }, {
        field: "age"
    }, {
        field: "rowNumber",
        title: "Row number",
        template: dataItem => grid.dataSource.indexOf(dataItem) + 1
    } ],
} ).data().kendoGrid;
Morteza Tourani
  • 3,506
  • 5
  • 41
  • 48
  • This is exactly what I was looking for and it works the exact same way for an Angular Kendo Grid implementation. – Levi Fuller Mar 02 '16 at 23:37
  • 3
    Just in case, the `template: (dataItem) => {...}` can only be used for ES6 browsers, you may need to do `function(dataItem) { var ds = ... }` for ES5. – Levi Fuller Mar 22 '16 at 19:19
2

I am using Angular and Kendo together and I set the index value like this (using Lodash):

dataBound : function () {
   _.each(this.items(), function (item, i) {
      var rowScope = angular.element(item).scope();
      rowScope.dataItem.index = i;
   });
}
sma
  • 9,449
  • 8
  • 51
  • 80
0

Lars Hoppner`s Answer Was Correct, But If You Change The page, the numbering will get reset. my solution was to add page number and page size to the formula:

$("#grid").kendoGrid({
    sortable: true,
    dataSource: [{
        name: "Jane Doe",
        age: 30
    }, {
        name: "John Doe",
        age: 33
    }],
    columns: [{
        field: "name"
    }, {
        field: "age"
    }, {
        field: "rowNumber",
        title: "Row number",
        template: "<span class='row-number'></span>"
    }],
    dataBound: function () {
        var rows = this.items();
        $(rows).each(function () {
            var index = $(this).index() + 1 
            + ($("#grid").data("kendoGrid").dataSource.pageSize() * ($("#grid").data("kendoGrid").dataSource.page() - 1));;
            var rowLabel = $(this).find(".row-number");
            $(rowLabel).html(index);
        });
    }
});
Ehsan Mirsaeedi
  • 6,924
  • 1
  • 41
  • 46
0

For server side pagination this script can be used (in columns section of grid):

{ title: "#", 
  template: dataItem => (grid.dataSource.page() - 1) *
            grid.dataSource.pageSize() + 
            grid.dataSource.indexOf(dataItem) + 1, 
  width: 45},
0

I think better implementation would be:

dataBound: function () {
            if (this.dataSource && this.dataSource._total) {
                var rows = this.items();
                for (var i = 0; i < rows.length; i++) {
                    var index = i + 1
                        + (this.dataSource.pageSize() * (this.dataSource.page() - 1));
                    var rowLabel = $(rows[i]).find(".row-number");
                    $(rowLabel).html(index);
                }
            }
        }
asdword
  • 1
  • 1
0

For me it worked like this

grid = $("#grid").kendoGrid({
    dataSource: dataSource,
    height: 543,
    scrollable: {
        virtual: true
    },
    pageable: {
        numeric: false,
        previousNext: false,
        messages: {
            display: "Showing {2} data items"
        }
    },
    columns: [
        {
            title: "#",
            // template: "#= ++record #",
            template: function(dataItem) {
                var rowNumber = 0
                if($("#grid").data("kendoGrid")) {
                  rowNumber = $("#grid").data("kendoGrid").dataSource.indexOf(dataItem) + 1;
                }
                return "<strong>" + rowNumber + "</strong>";
            },
            width: 80
        },
        { field: "FirstName", title: "First Name" },
        { field: "LastName", title: "Last Name" },
        { field: "City", title: "City" },
        { field: "Title" }
    ]
});`

without using $("#grid").data("kendoGrid") this in first renders it was showing 0 as row number.

CMartins
  • 3,247
  • 5
  • 38
  • 53
chintan adatiya
  • 1,233
  • 14
  • 17
0

One more alternative approach. You can do it in 3 simple steps:

  1. create a variable that will keep row number
  2. drop the value to 0 in the dataBinding
  3. pass function to the template which will increment your variable for each row

enter image description here

safinilnur
  • 199
  • 1
  • 4