I found my self constructing a complex Worksheet server side in C#. Most of the spreadsheet methods are not chainable, as I had become accustomed to in my experience with LINQ processing and client side javascript. I'm paying it forward with this code, some simple CellSelection extension methods that made constructing my worksheets easier. The methods are not comprehensive -- only made the ones I needed. For example:
I'm working a project which will allow users to update several database tables with an Excel file. Using the Kendo Spreadsheet widget, I can import the file's information into the Kendo Spreadsheet widget, or I can create one with information bound to the tables I want to update and export that data, but I've yet to find a solution that will accomplish both.
Ideally, I'd like the user to be able to export a .xlsx file from the bound tables, edit that file to create new entries, and them import it back into the widget to view and save to the database. This would allow existing controllers to be utilized and provide a smooth one stop interface for the user.
Hi,
I'm trying to refresh tooltip in grid but it's not working. Here's what I'm doing:
I have an MVC Grid and I initialize the tooltip like this:
var tooltip = $("#classesAvailableGrid").kendoTooltip({
filter: ".comment",
position: "top",
width: 180,
content: function (e) {
var dataItem = $('#classesAvailableGrid').data('kendoGrid').dataItem(e.target.closest('tr'));
var id = dataItem["Id"];
var text = $('#com-' + id).data('tooltiptext');
return text;
}
}).data("tooltiptext");
This works fine.
The functionality I'm seeking is when I click the cell where I have the tooltip I prompt the user with a popup input field where he can update the tooltip message. On success I save the new message to database but then I want to update the tooltip as well. I am able to update the data attribute but the actual message that is displayed on hover is still the same.
var request = $.ajax({
url: '/Controller/ActionMethod',
type: 'POST',
data: JSON.stringify(msg),
contentType: 'application/json; charset=utf-8'
}).success(function (data) {
if (0 >= data.error.length) {
if (data.icon) {
if (el.find('i').length) {
el.find('i').attr('data-tooltiptext', inputValue);
/*console.log(selectedTooltip);
selectedTooltip.tooltip.options.content = inputValue;
selectedTooltip.tooltip.refresh();*/
//$("#classesAvailableGrid").data('tooltiptext').refresh();
}
else {
var i = '<i id="com-' + el.data('rid') + '" class="fa fa-comment comment" data-tooltiptext="' + inputValue + '" aria-hidden="true"></i>';
el.find('div').append(i);
}
}
else {
el.find('div').empty();
}
swal({
title: data.title,
text: data.success,
type: "success",
timer: 1000,
});
}
else {
swal(data.title, data.error, "error");
}
}).error(function (data) {
});
I have tried several things but none have worked. Any help would be appreciated!
Thank you,
Jokull

When using the validation configuration of Upload component and the user chooses a file that is not in the "AllowedExtensions" array, a short error message appears inside the upload component. While everything else is translated into German, this message is still in English. How can I provide a German translation to this?

Hello everybody.
As you can see here current grid I've made goes out of the screen only I apply "Filterable" property to it and only then. I need column filtering but without the grid extending out of my screen.
Here's the current code
@(Html.Kendo().Grid<POSLogGridData>() .Name("grid") .Columns(columns => { columns.Bound(c => c.ID); columns.Bound(c => c.ErrorLevel); columns.Bound(c => c.Time); columns.Bound(c => c.Location); columns.Bound(c => c.Data); }) .Filterable(filterable => filterable .Extra(false) .Operators(operators => operators .ForString(str => str.Clear() .StartsWith("Starts with") .IsEqualTo("Is equal to") .IsNotEqualTo("Is not equal to"))) ) .Pageable(pager => pager.Refresh(false)) .Sortable(sortable => sortable.Enabled(true)).AutoBind(false) .Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple)) .AllowCopy(true) .DataSource(dataSource => dataSource.Ajax().ServerOperation(false).Batch(false).PageSize(100) .Model(model =>{ model.Field(gridMainAlias => gridMainAlias.ID).Editable(false); model.Field(gridMainAlias => gridMainAlias.ErrorLevel).Editable(false); model.Field(gridMainAlias => gridMainAlias.Time).Editable(false); model.Field(gridMainAlias => gridMainAlias.Location).Editable(false); model.Field(gridMainAlias => gridMainAlias.Data).Editable(false); })).Resizable(resize => resize.Columns(true)) )
Thanks for help in advance!

My use case calls for forms that may be duplicated across multiple TabStrip tabs as editors for different entities of the same type.
So tab 1 calls for Entity1 editor, tab 2 calls for Entity1 editor also.
This introduces possibility of duplicate IDs on the same page.
At the moment I have a super clunky prefix system utilizing ViewData.TemplateInfo.HtmlFieldPrefix. This is hardly intuitive nor easy to use.
One idea i had about managing this issue is to "unload" tabs as they get placed in the background. Essentially bundling up the html/data and storing it until the tab is selected again, where it'll unbundle and load into the tab.
I got as far as grabbing the contents of the tab via jQuery's .html() function, but reinserting the html doesn't do anything script-wise, i.e. no widgets are widgetizing.
Running into that, I'm not sure if there's any way to proceed with this idea.
Another idea I had is dumping the contents of a tab into an iframe. I haven't implemented anything like this yet, nor do I know if its a good idea.
Anyone else having to deal with this type of issue?
Any suggestions/comments on the ideas above?
What are your solutions?
I'm trying to pass the model from my parent view through to the partial views that are being loaded in the tabstrip. At this point, what seems to be passed is a List<string> containing the type of the model rather than the model itself, which is a List<string> containing the words "Hello" and "Goodbye". Here's some sample code that demonstrates the issue.
The controller:
public ActionResult TabStrip(){ ViewBag.Message = "TabStrip Test"; List<string> details = new List<string>(); details.Add("Hello"); details.Add("Goodbye"); return View(details);}public ActionResult TabA(List<string> details){ return PartialView(details);}public ActionResult TabB(List<string> details){ return PartialView(details);}The main View:
@model List<string>@{ ViewBag.Title = "TabStrip";}<h2>TabStrip</h2>@Model[0], @Model[1]@(Html.Kendo().TabStrip() .Name("tabstrip") .Items(tabstrip => { tabstrip.Add().Text("Tab A") .Selected(true) .LoadContentFrom("TabA", "Home", new { details = Model }); tabstrip.Add().Text("Tab B") .Selected(true) .LoadContentFrom("TabB", "Home", new { details = Model }); }))The Partial Views:
Tab A:
@model List<string> <p>Welcome to TabA!</p>@Model[0]Tab B:
@model List<string> <p>Welcome to TabB!</p>@Model[1] -- causes errorThe result upon first loading the page is attached. The first item in the list shows up in the partial view as "System.Collections.Generic.List`1[System.String]" rather than "Hello." Upon clicking Tab B, an exception is thrown because there is no second item in the list.
So clearly the model is not being passed correctly to the partial views. Any ideas on this?
Thanks!
Laurie
@{ ViewBag.Title = "My Index";}<div id="portal" class="k-content"> <div class="wrapper"> @(Html.Kendo().TabStrip() .Name("tabstrip") .Items(tabstrip => { tabstrip.Add().Text("Information") .Selected(true) .LoadContentFrom("Information", "MyController"); tabstrip.Add().Text("Schedule") .LoadContentFrom("Calendar", "MyController"); tabstrip.Add().Text("Plan") .LoadContentFrom("Plan", "MyController"); tabstrip.Add().Text("Pending") .LoadContentFrom("Pending", "MyController"); }) ) </div></div>@section Scripts{}public ActionResult Information() { //get model data.... model = blaw blaw return View("Information", model);}@(Html.Kendo().ComboBox() .Name("languagesDdf") .Placeholder("Select Language...") .DataTextField("LanguageValue") .DataValueField("LanguageId") .Suggest(true) .AutoBind(false) .HtmlAttributes(new { style = "width: 100%" }) .DataSource(source => { source.Read(read => { read.Action("GetLanguages", "Language"); }).ServerFiltering(true); }) .Events(e => { e.Select("onSelectLanguage"); }) )