Hi,
Would like to dynamically control whether a grid has a slider control for the roles.
The algorithm /flow would look something like this:
grid is declared and options initialized within windows.onload or $(document).ready(function() {});
user makes selection to load grid
data populates the datSource from an API request.
if(dataSource.length > 10 )
then let scrollable = true;
else
scrollable = false;
The idea here is it would dynamically adjust that scrollable option after a certain length threshold would be met.
attached here is how I have my grid set up..also I have the sort and dataBound handlers doing stuff.
Here is inline version of JavaScript / jQuery kendo code that declares and does some initialization:
$("#myGrid").kendoGrid({
width: 1400,
height: 500,
sortable: {
mode: "single",
allowUnsort: false
},
resizable: true,
editable: true,
scrollable: true,
columns: modifiedColumns, // Use updated columns
dataSource: mappingsDS,
selectable: "multiple, row",
Thanks,
George
@( Html.Kendo().Grid((IEnumerable<
Route.StopLocation
>)ViewData["Stops"])
.Name("selectedStops")
.Columns(columns =>
{
columns.Bound(p => p.StopNo).Title("Stop No.");
columns.Bound(p => p.Id).Title("ID");
columns.Bound(p => p.StopLocation).Title("Stop Location");
})
// .Selectable causes NotSupportedException: There is no DataSource Model Id property specified.
.Selectable(s => s.Mode(GridSelectionMode.Multiple))
)
Hello
I have a grid and each row can be expanded, using detailInit, to show an inner grid.
I fetch the data beforehand so that I can populate the grid using local data.
In inner grid I have a column with a delete button - using template I call a delete function passing this as a parameter.
// column definition
{
field: "delete",
title: "Delete",
width: 50,
template: "<span class='delete' onclick='delete(this)'><img src='.delete_icon.png'/></span>"
},
my delete function :
function delete(e) { let Loader = KENDO.KendoLoader($("body")); try { Loader.Show(); let row = $(e).closest("tr"); let grid = $(e).closest(".innerGrid"); let dataItem = KENDO.KendoGrid(grid).GetDataItem(row); let innerRowId= dataItem.id; let parentRow = row.parent().closest(".k-detail-row").prev(); let parentDataItem = KENDO.KendoGrid($("#ParentGrid")).GetDataItem(parentRow); KENDO.KendoGrid(grid).DeleteUI([innerRowId]); // DeleteUI gets array of ids to delete , implemented below // if no rows remain in inner grid, I need to update a column's value in the parent row if (KENDO.KendoGrid(grid).HasRows() == false) { grid.hide(); grid.siblings(".noRecordsFound").show(); let updatedDataObj = { id: parentDataItem.id, someColumnOnParentRow: null } KENDO.KendoGrid($("#ParentGrid")).UpdateUI([updatedDataObj]); // UpdateUI gets array of objects to update, implemented below } } catch (error) { debugger; console.log(error.message); } finally { Loader.Hide(); } }
We have created a own KENDO wrapper script for different widgets. Here is the kendoGrid code:
let KENDO = { KendoComponent(jQueryElement, component, options = null) { let kendoComponent = {}; kendoComponent.InitKendoComponent = function () { let kComponent = jQueryElement.data(component); if (!kComponent) { if (options) { kComponent = jQueryElement[component](options).data(component); } else { kComponent = jQueryElement[component]().data(component); } } return kComponent; }; return kendoComponent; }, KendoGrid(jQueryElement, options = null) { let kendoGrid = {}; let kGrid = KENDO.KendoComponent(jQueryElement, "kendoGrid", options).InitKendoComponent(); if (options) kGrid.setOptions(options); kendoGrid.SetOptions = function (options) { kGrid.setOptions(options); return kendoGrid; } kendoGrid.GetData = function () { return Array.from(kGrid.dataSource.data()); } kendoGrid.GetDataItem = function (jQueryTableRow) { return kGrid.dataItem(jQueryTableRow); } kendoGrid.UpdateUI = function (dataToUpdate = []) { dataToUpdate.forEach(obj => { let dataItem = kGrid.dataSource.get(obj.id); if (dataItem) { for (let prop in obj) { if (prop !== "id") { dataItem.set(prop, obj[prop]); } } } }); return kendoGrid; } kendoGrid.DeleteUI = function (idsToDelete = []) { idsToDelete.forEach(id => { let dataItem = kGrid.dataSource.get(id); if (dataItem) kGrid.dataSource.remove(dataItem); }); return kendoGrid; }; kendoGrid.HasRows = function () { return kGrid.dataSource.data().length > 0; } return kendoGrid; } }
It appears that UpdateUI does not function as it should.
When I test I notice that when the last remaining row of inner grid is deleted, the parent row's column is indeed updated to null, the No Records Found message is shown instead of the inner grid, the parent row gets collapsed, and when I expand it the inner grid is shown with the last remaining row.
Suprisingly, if I comment out the UpdateUI line, the inner grid's row gets deleted, without collapsing the inner grid and the No Records Found message is shown as intended (the parent row's column does not get updated in this case, obviously).
Is it a bug in Kendo ? or am I doing something wrong?
For certain types of data in my grid, I need to define custom filter operators, e.g.:
updateOrAddFilter(fieldKey, {
field: fieldKey, operator: function (item) {
const nItem = normalize(item);
const nValue = normalize(value);
return nItem && nItem.includes(nValue);
}
});
The updateOrAddFilter function then browses through the all the filters currently applied to the grid's dataSource, replaces old current-column filters with the new one and keeps all the other-column ones, and updates the grid's dataSource as such:
grid.dataSource.filter({ logic: "and", filters: updatedFilters });
I've seen your demos on setting up the type: "date" and the format: stuff on the model and on the column display for the grid. Your demo sorts the dates as if they are dates properly. Ours shows the value as null if we set the type to date. It displays the string properly if we set it to type string but still sorts as a string. If we simply set the column to the kendo format and do not use a schema on the datasource, our code still sorts as a string.
https://dojo.telerik.com/TgCibbiL
When I looked at the data in your demo, it looks like the long form GMT. Today, we are instead blocking the script from sending the .NET property types of DateTime and instead sending a pre-formatted string of the date. Ran into some serialization issues when posting those same objects with DateTime properties on them.
Are you returning your DateTime properties as strings but formatted in this GMT when you serialize your .NET data objects back to the JavaScript handlers?
Module Bundlers - Kendo UI Third-Party Tools - Kendo UI for jQuery
The module bundlers page references Vite as an example which leads me to believe that it can be used with Kendo.
However even this basic example doesn't appear to work: https://stackblitz.com/edit/vitejs-vite-i842ucun?file=src%2Fmain.js
Am I doing something wrong?
When you touch-drag the grid, it doesn't look good if you move it diagonally. It's confusing. It looks distracting. What if you only want it to move up and down, or left and right?
Isn't there a very simple code?
Thank you.