'How to customize column template when kendo grid column is auto generated?

I assign the datasource into the Kendo grid using javascript:

var dataSource = new kendo.data.DataSource({
    transport: {
        read: {
            url: "@Url.Action("GetProductList", "Home")",
            type: "POST"
        }
    }       
});
var grid = $("#gridHardwares").kendoGrid({
    dataSource: dataSource,
    height: 600,
    sortable: true,
    groupable: true,
    pageable: {
        refresh: true,
        pageSizes: true,
        buttonCount: 5
    },
    resizable: true
}).data("kendoGrid");

Note that the datasource column is generated dynamically (it will expand every year).

Therefore, I could not find a way to customize the columns now. What can I do here to customize it like, add in additional checkbox column, edit the header, and also set groupFooterTemplate?

Previously, the columns are fixed and I can customize easily:

columns: [
{
    template: "<input type='checkbox' class='checkbox' />",
    width: 20
}, {
    field: "PRODUCT_NAME",
    title: "Product Name",
    width: 200
}, {
    field: "PRICE2017",
    title: "Price 2017",
    width: 200,
    aggregates: ["sum", "average"],
    groupFooterTemplate: "Sum: #= kendo.toString(sum, '0.00') # || Average: #= kendo.toString(average, '0.00') #"
}]

Also, is it possible to make the data editable in the grid?



Solution 1:[1]

I post my solution here, maybe it could help someone in future.

    var customColumns =  [{
            template: "<input type='checkbox' class='checkbox' />",
            width: 20
        }];

then customized your own title: var customHeaders = []

    for (var i = 0; i < customHeaders.length; i++) {
    if (i > 4) // after Name, Description, Region etc..
    {
        if (i == 5) // start with the first price column
        {
            customColumns.push({ 
                title : customHeaders[i], 
                field: headers[i],
                width: 150,
                template:
                    "# if(" + headers[i] + " != null) {# " +
                    "#= kendo.toString(" + headers[i] + ", 'n') #" +
                    "# } else { #" +
                    "" +
                    "#} # ",
                aggregates: ["sum", "average"],
                groupFooterTemplate: "Sum: #= kendo.toString(sum, '0.00') # || Average: #= kendo.toString(average, '0.00') #"
            });
        }
        else // compare price with previous year
        {
            customColumns.push({ 
                title : customHeaders[i], 
                field: headers[i],
                width: 150,
                template:
                    "# if(" + headers[i] + " != null) {# " +
                    "#= calculatePercentage(" + headers[i-1] + ", " + headers[i] + ") #" +
                    "# } else { #" +
                    "" +
                    "#} # ",
                aggregates: ["sum", "average"],
                groupFooterTemplate: "Sum: #= kendo.toString(sum, '0.00') # || Average: #= kendo.toString(average, '0.00') #"
            });
        }
    }
    else
    {
        customColumns.push({ 
            title : customHeaders[i], // customized header
            field: headers[i] // original header
        });
    }
}

Thank you Sandman for the hints!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 newbieeee