Hi there - apologies if this is elsewhere, but I've searched and can't find an answer. I have good C# experience, but I'm relatively new to Telerik/Kendo etc,
I am aware of the AllPages(true) option for the Excel printout. What I would like to do on my Grid is to have two excel buttons, one that will export the current page, and one which will export all data.
Is this possible? From what I can see, you can only define one Excel Button on the toolbar.
Thanks in advance.
I'm trying the grouping in Grid I want to display the sum of the column as ClientGroupHeaderColumnTemplate or ClientHeaderTemplate but doesn't seem to be working, it only shows as a ClientFooterTemplate. :
@(Html.Kendo().Grid<Models.DepartmentSummaryView> () .Name("grid") .HtmlAttributes(new { style = " height:700px !important;" }) .Columns(columns => { columns.Bound(p => p.DepartmentNo).Width(150).ClientGroupHeaderTemplate("Department: #= value # (Products: #= count#)"); columns.Bound(p => p.DepartmentName).Width(150).ClientGroupHeaderTemplate("Department: #= value # (Products: #= count#)"); columns.Bound(p => p.ProductNo).Width(150).ClientGroupHeaderTemplate("Product: #= value # (Count: #= count #)"); columns.Bound(p => p.ProductName).Width(150); columns.Bound(p => p.SKU).Width(150); columns.Bound(p => p.Qty).Width(150).ClientGroupHeaderColumnTemplate("Sum: #= sum #").ClientFooterTemplate("Sum: #= sum #"); }) .Filterable(filterable => filterable.Extra(false) //.Mode(GridFilterMode.Row) .Operators(operators => operators .ForString(str => str.Clear() .StartsWith("Starts with") .EndsWith("Ends with") .IsEqualTo("Is equal to") .IsNotEqualTo("Is not equal to") .Contains("Contains") .DoesNotContain("Doesn't contain") ))) //.Pageable() .Navigatable() .AutoBind(false) .Sortable() .Groupable() .Events(events => events.DataBound("onDataBound")) .Reorderable(reorderable => reorderable.Columns(true)) .DataSource(dataSource => dataSource .Custom() .Schema(schema => { schema.Data("Data"); schema.Total("Total"); }) .Events(events => events.Sync("sync_handler")) .Group(groups => groups.Add(p => p.DepartmentNo)) .Aggregates(aggregates => { aggregates.Add(p => p.DepartmentNo).Count(); aggregates.Add(p => p.DepartmentName).Count(); aggregates.Add(p => p.ProductNo).Count(); aggregates.Add(p => p.SKU).Count(); aggregates.Add(p => p.Qty).Sum(); }) .Transport(transport => { transport.Read(read => read.Url("/api/enquiries/departmentsummary) .DataType("json") .Type(HttpVerbs.Get) ); transport.Create(create => create.Url(Base.APIHostAddress + "/api/enquiries/post") .DataType("json") .Type(HttpVerbs.Post) .ContentType("application/json; charset=utf-8") ); transport.ParameterMap("parameterMap"); }) ))

I have got a problem where my grid columns expect a detailed name ("CityFrom" and "CityTo" - those are strings), but a method returns "Name" property. How can I map the result to the columns without duplicating the code?
Here is grid:
@(Html.Kendo().Grid<RouteDto>().Name("route-grid").Columns(cfg =>{ cfg.Bound(m => m.CityFrom) .Title("City From") .Width(150) .Filterable(f => f.Multi(true).DataSource(ds => ds.Read(r => r.Action("GetCities", "City") ) ) ); cfg.Bound(m => m.CityTo) .Title("City To") .Width(150) .Filterable(f => f.Multi(true).DataSource(ds => ds.Read(r => r.Action("GetCities", "City") ) ) );}))
Here is method:
public ActionResult GetCities(){ var cities = _cityService.GetCities().Select(c => new { c.Name }).ToList(); return Json(cities, JsonRequestBehavior.AllowGet);}Error I am getting is in console:
Uncaught ReferenceError: CityFrom is not definedUncaught ReferenceError: CityTo is not defined
On grid I could use .DataTextField("Name"), but I don't have this option here. Both filters have got the same set of values - cities from database. Any ideas what can I do elegantly here?

Hi,
I was wondering if there is a way to accomplish the toolbar functionality in a TreeList as shown for this example in a Grid: Grid / Toolbar template
We need a filtering textbox in the toolbar, that filters the items when the input has changed.
In the pages with Grid's I use buttons with icons from Font Awesome in the Toolbar, in the TreeList I only seem to be able to add buttons via Custom:
.Toolbar(toolbar => { toolbar.Custom().Name("addfieldbutton").Text("Veld toevoegen"); toolbar.Custom().Name("addfolderbutton").Text("Folder toevoegen"); })
It would be nice to keep the design the same when using a TreeList.
Here's my Toolbar for a grid.
.ToolBar(toolbar =>{ toolbar.Template( @<text> @(Html.Kendo().Button() .Name("ButtonAddProperty") .HtmlAttributes(new { type = "k-button" }) .Content("Property toevoegen") .SpriteCssClass("fa fa-plus") .Events(e => e.Click("onCreateProperty")) ) </text>);})
Best regards,
Ronald

Is there any way to disable date by both? Such as to disable it by all Tuesdays and Thursdays in addition to by a list of specific dates recorded in the database?
I see it how to disable date picker by days of weeks or by a list of specific dates at the demo. I found the example of the way to disable weekends and dates specified(holidays). But the not finding a solution for the case that I need it to be implemented.
Thank you.
Hello,
My widgets just stopped working! I am getting the error "Script5009 Kendo not defined". It seems the browser does not know what to do with the widgets. I am not getting any errors otherwise.
I am running version 2018 3.0727.
Should I rerun the ProgressControlPanelSetup_2018_3_0727.exe to reinstall?
Thanks for your help!
Carolyn
Hello,
I am trying to implement a dropdownlist in a grid popupedit, that select Users from Azure Active Directory. I access the Azure Active Directoty with the Graph Api, so that I always get only a part of the users in the controller to return to the dropdownlist.
The controller sends the data of the users as SelectListItems (Text: Lastname, Firstname; Value: E-Mail).
The selection of a user in a new record works fine and the email address is saved in the database.
But if I want to edit this record, the dropdownlist is empty, because the dropdownlist needs the value for "Text" the Lastname and Firstname.
Is it possible to insert a value for Text and Value in the DropDownList, when editing a record?
I'm trying to add a foreign key column in my grid. I have a backups table that has a pc_id column. I also have a pc table with pc_id and pc_name columns. Right now, my grid is displaying the pc_id because that is the value that is stored in the backups table. However, I want the grid to display the pc_name.
Index.cshtml:
@{ ViewBag.Title = "Backup Dashboard";}@model IEnumerable<MayetDashboard.Models.backup><h1>Backup</h1>@(Html.Kendo().Grid(Model) .Name("Grid") .Columns(columns => { columns.Bound(c => c.backup_id).Title("Backup ID"); columns.Bound(c => c.pc_id).Title("PC ID"); //columns.ForeignKey(c => c.pc_id, (System.Collections.IEnumerable)ViewData["pc"], "pc_id", "pc_name").Title("PC ID"); columns.Bound(c => c.log_file).Title("Log File").Hidden(true); columns.Bound(c => c.backup_date).Title("Backup Date"); columns.Bound(c => c.backup_job).Title("Backup Job"); columns.Bound(c => c.backup_result).Title("Backup Result"); columns.Bound(c => c.backup_text).Title("Backup Text").Hidden(true); columns.Bound(c => c.stamp_date).Title("Stamp Date"); columns.Command(command => { command.Destroy(); }); }) .Pageable() .Filterable(filter => { filter.Extra(false); filter.Operators(op => { op.ForString(str => { str.Clear().Contains("Contains"); }); }); }) .DataSource(dataSource => dataSource .Server() .Model(model => { model.Id(p => p.backup_id); model.Field(p => p.pc_id).DefaultValue(1); }) .Read(read => read.Action("Index", "Backup")) .Destroy("backups_Destroy", "Backup") ))
BackupController.cs:
using System;using System.Linq;using System.Data;using System.Collections.Generic;using System.Web.Mvc;using System.Web.Routing;using Kendo.Mvc.Extensions;using MayetDashboard.Models;using System.Data.Entity;using System.IO;using Telerik.Windows.Zip;using System.IO.Compression;using System.Text.RegularExpressions;using System.Data.SqlClient;using Kendo.Mvc.UI;namespace MayetDashboard.Controllers{ public class BackupService : IDisposable { private mayet_dashboardEntities1 db; public BackupService(mayet_dashboardEntities1 db) { this.db = db; } public IEnumerable<backup> Read() { return db.backups; } public void Destroy(backup backup) { var entity = new backup { backup_id = backup.backup_id, pc_id = backup.pc_id, log_file = backup.log_file, backup_date = backup.backup_date, backup_job = backup.backup_job, backup_result = backup.backup_result, backup_text = backup.backup_text, stamp_date = backup.stamp_date, }; db.backups.Attach(entity); db.backups.Remove(entity); db.SaveChanges(); } public void Dispose() { db.Dispose(); } } public class BackupController : Controller { private BackupService backupService; public BackupController() { backupService = new BackupService(new mayet_dashboardEntities1()); } protected override void Dispose(bool disposing) { backupService.Dispose(); base.Dispose(disposing); } public ActionResult Index() { return View(backupService.Read()); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Backups_Destroy(backup backup) { RouteValueDictionary routeValues; backupService.Destroy(backup); routeValues = this.GridRouteValues(); return RedirectToAction("Index", routeValues); } public void Update() { //GET ALL ZIPPED UP LOG FILES string[] arrayLogs = Directory.GetFiles(@"\\192.168.222.245\Backups\logs", "*.zip", System.IO.SearchOption.AllDirectories); var countLogs = arrayLogs.Length; string tempFolder = @"C:\temp\"; for (int i = 0; i < countLogs; i++) { string logItem = arrayLogs[i]; var logDirectory = new FileInfo(logItem).DirectoryName; //ZipFile.ExtractToDirectory(logItem, @"C:\temp\"); using (System.IO.Compression.ZipArchive archive = ZipFile.OpenRead(logItem)) { foreach (System.IO.Compression.ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase)) { entry.ExtractToFile(Path.Combine(tempFolder, entry.FullName), true); } } } //BACKUP_TEXT COLUMN string backupText = System.IO.File.ReadAllText(tempFolder + "LogFile.txt"); string resultBackupText = Regex.Replace(backupText, @"^\s+$[\r\n]*", string.Empty, RegexOptions.Multiline); //PC_ID COLUMN int startPosPcId = resultBackupText.LastIndexOf("Computer/Account: ") + "Computer/Account: ".Length; int lengthPcId = resultBackupText.IndexOf(" /") - startPosPcId; string subPcId = resultBackupText.Substring(startPosPcId, lengthPcId); int finalSubPcId = 0; if (subPcId == "REA015-PC") finalSubPcId = 1; else if (subPcId == "REA010-PC") finalSubPcId = 2; else if (subPcId == "DESKTOP-V4KPLUF") finalSubPcId = 3; else if (subPcId == "REA014-PC") finalSubPcId = 4; else if (subPcId == "REA005-PC") finalSubPcId = 5; else if (subPcId == "REA016-PC") finalSubPcId = 6; else if (subPcId == "SCOTT-PC") finalSubPcId = 7; else if (subPcId == "DESKTOP-Q6FFN6U") finalSubPcId = 8; else if (subPcId == "REA009-PC") finalSubPcId = 9; else if (subPcId == "ALI-PC") finalSubPcId = 10; else if (subPcId == "REA006-PC") finalSubPcId = 11; else if (subPcId == "DESKTOP-0B5GIC0") finalSubPcId = 12; else if (subPcId == "REA018-PC") finalSubPcId = 13; else if (subPcId == "EDREAINC-PC") finalSubPcId = 14; else if (subPcId == "REA013-PC") finalSubPcId = 15; else if (subPcId == "REA011-PC") finalSubPcId = 16; else if (subPcId == "JEA-PC") finalSubPcId = 17; else if (subPcId == "DESKTOP-UHJ55OH") finalSubPcId = 18; else if (subPcId == "REA019-PC") finalSubPcId = 19; //BACKUP_DATE COLUMN int startPosBackupDate = resultBackupText.IndexOf("Backup end: ") + "Backup end: ".Length; int lengthBackupDate = resultBackupText.IndexOf("Time taken: ") - startPosBackupDate; string subBackupDate = resultBackupText.Substring(startPosBackupDate, lengthBackupDate); string resultSubBackupDate = subBackupDate.TrimEnd('\n').TrimEnd('\r'); DateTime finalResultSubBackupDate = DateTime.Parse(resultSubBackupDate); //BACKUP_JOB COLUMN int startPosBackupJob = resultBackupText.IndexOf("Iperius Backup Report") + "Iperius Backup Report".Length; int lengthBackupJob = resultBackupText.IndexOf("Backup start: ") - startPosBackupJob; string subBackupJob = resultBackupText.Substring(startPosBackupJob, lengthBackupJob); string resultSubBackupJob = subBackupJob.TrimStart('\r').TrimStart('\n').TrimEnd('\n').TrimEnd('\r'); //BACKUP_RESULT COLUMN int startPosBackupResult = resultBackupText.IndexOf("Backup result: ") + "Backup result: ".Length; int lengthBackupResult = resultBackupText.LastIndexOf("Backup start: ") - startPosBackupResult; string subBackupResult = resultBackupText.Substring(startPosBackupResult, lengthBackupResult); string resultSubBackupResult = subBackupResult.TrimEnd('\n').TrimEnd('\r'); //INSERT INTO BACKUP TABLE using (var context = new mayet_dashboardEntities1()) { var table = new backup { pc_id = finalSubPcId, log_file = logItem, backup_date = finalResultSubBackupDate, backup_job = resultSubBackupJob, backup_result = resultSubBackupResult, backup_text = resultBackupText, stamp_date = DateTime.Now }; context.backups.Add(table); context.SaveChanges(); } //MOVE LOG FILE FROM LOGS TO LOGS_PROCESSED FOLDER string fileName = Path.GetFileNameWithoutExtension(logItem); string fileExtension = Path.GetExtension(logItem); Regex rgx = new Regex("[^a-zA-Z0-9 -]"); string fileBackupDate = rgx.Replace(resultSubBackupDate, ""); string fileRename = @"\\192.168.222.245\Backups\logs_processed\\" + fileName + "_" + subPcId + "_" + fileBackupDate + fileExtension; System.IO.File.Move(logItem, fileRename); } } }}
pc.cs:
//------------------------------------------------------------------------------// <auto-generated>// This code was generated from a template.//// Manual changes to this file may cause unexpected behavior in your application.// Manual changes to this file will be overwritten if the code is regenerated.// </auto-generated>//------------------------------------------------------------------------------namespace MayetDashboard.Models{ using System; using System.Collections.Generic; public partial class pc { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public pc() { this.backups = new HashSet<backup>(); this.events = new HashSet<@event>(); } public int pc_id { get; set; } public string pc_name { get; set; } public Nullable<int> user_id { get; set; } public string system { get; set; } public string service_tag { get; set; } public Nullable<System.DateTime> purchase_date { get; set; } public string backup_code { get; set; } public string systeminfo_dump { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<backup> backups { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<@event> events { get; set; } public virtual user user { get; set; } }}
backup.cs:
//------------------------------------------------------------------------------// <auto-generated>// This code was generated from a template.//// Manual changes to this file may cause unexpected behavior in your application.// Manual changes to this file will be overwritten if the code is regenerated.// </auto-generated>//------------------------------------------------------------------------------namespace MayetDashboard.Models{ using System; using System.Collections.Generic; public partial class pc { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public pc() { this.backups = new HashSet<backup>(); this.events = new HashSet<@event>(); } public int pc_id { get; set; } public string pc_name { get; set; } public Nullable<int> user_id { get; set; } public string system { get; set; } public string service_tag { get; set; } public Nullable<System.DateTime> purchase_date { get; set; } public string backup_code { get; set; } public string systeminfo_dump { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<backup> backups { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<@event> events { get; set; } public virtual user user { get; set; } }}
Thank you!

Hi support team
Our customer wants to display the content of a simple (i.e. one sheet, simple content, see sample image attached) excel on a ASP.NET MVC rendered page. Is there a way to configure the Spreadsheet component without any menues and additional functionality like editing, copy/paste, etc.?
Or is there a smarter way to provide such "viewer-only" functionality, like loading the excel sheet and display its contet in a Grid component?
Uploading the file is not an issue, we have implemented this already. My question is only about rendering/displaying the content of a excel sheet on a page.
Any advice is highly appreciated.
Regards, Daniel