We recently updated our nuget reference for "Telerik.UI.for.AspNet.Core" to Version="2023.2.606", and the Select All checkbox stopped working. (It only selects the first row)
It works using Version="2020.2.617"
Here is one of our grids:
<div class="table table-responsive" style="background-color:#444547">
@(Html
.Kendo()
.Grid<ViewModelRedacted>()
.Name("grdUnitsList")
.Columns(columns =>
{
columns.Select().Width("20px");
columns.Bound(c => c.Id).Hidden(true);
columns.Bound(c => c.Name).Title(UnitsController.NameColumn);
})
.Selectable(s => s.Mode(GridSelectionMode.Multiple))
.ColumnMenu()
.ToolBar(tool => tool.Excel())
.Excel(ex => ex
.FileName("Units.xlsx")
.Filterable(true)
.AllPages(true)
)
.Navigatable()
//.Scrollable()
.Pageable()
.Filterable()
.Sortable(sortable =>
{
sortable.SortMode(GridSortMode.SingleColumn);
})
.Resizable(resize => resize.Columns(true))
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Model(model => model.Id(p => p.Id))
.ServerOperation(false)
.Read(read => read.Action("GetUnits", "Units"))
)
)
</div>
Hi,
From this Model :
publicclassMyRowData
{
public int Id { get; set; }
public SelectList Values { get; set; }
public string Value { get; set; }
}
publicclassMyGridData
{
public IEnumerable<MyRowData> Rows { get; set; }
}
I want to bind my model to a grid in view like :
@(Html.Kendo.Grid(Model.Rows)
.Name("myGrid")
.Columns(c =>
{
c.Bound(i => i.Id).Visible(false);
c.ForeignKey(t => t.Value, t => t.Values); //Here is the bind for drop downlist (différent for each row
//And how can achieve this ?
})
.Navigatable()
.Scrollable()))
Thanks for help
Hi ,
I am using Telerik.UI.for.AspNet.Core version 2020.3.915
I have created dynamic kendo grid using jquery. my model will vary depending in columns from db. So I am gettign the data as json from DB and creating my grid. i am able to achieve it, But when I try to edit the column values, I am unable to call the controller mthod with proper values from UI. I wanted to do batch edit. But when I use the below code , my controller is getting called multiples times for each edit. Also ,t he value passed is not a proper array. It is in Json format . but looks like { Steer_ID:23,SteerMaximun:34,.......} . Please hepl me to send all the row values that are edited in jason format to the comtroller.
js:
function generateMarginSnapshotColumns(gridData, isEditable) {
var isdisable = "";
if (!isEditable)
isdisable = "disabled";
// initiate the column array
var columns = [];
var groupedColumns = [];
//initiate a counter, used to work out which column we are dealing with
var columnIndex = 0;
var groupedColumnIndex = 0
// define the desired order of the columns
var columnOrder = {
KPI_UNIT_CODE: 1,
KPI_CLASS_DISPLAY_NAME: 2,
STEER_VALUE: 3,
STEER_MAXIMUM_VALUE: 4,
STEER_MINIMUM_VALUE: 5,
DIRECTION_CODE: 6,
MARGIN_DELTA: 7,
DOI: 8,
ENS: 9,
CREATION_USER_ID: 50,
CREATION_DATE: 51,
LAST_UPDATE_USER_ID: 52,
LAST_UPDATE_DATE: 53
// Add more columns and their desired order as needed
};
var NoDisplayColumns = ["STEER_ID", "KPI_SITE_HIERARACHY_ID", "KPI_CLASS_GROUP_CODE", "ACKNOWLEDGEMENT_IND", "KPI_AREA_NAME", "KPI_UNIT_NAME"];
// iterate all of the data items in the first element of the returned JSON data
for (var dataItem in gridData) {
var colTitle = dataItem.replace('_', ' ');
var dataItemField = dataItem;
// create the columns and set up the look and feel - first three are always present and fixed in place
switch (dataItemField) {
case "CREATION_USER_ID":
case "CREATION_DATE":
case "LAST_UPDATE_USER_ID":
case "LAST_UPDATE_DATE":
columns.push({ field: dataItemField, title: colTitle, width: 100, locked: true, hidden: true, headerAttributes: { style: "text-align: left" }, order: columnOrder[dataItemField], editable:true });
break;
case "KPI_UNIT_CODE":
columns.push({ field: dataItemField, title: "UNIT", width: 200, locked: true, headerAttributes: { style: "text-align: left" }, order: columnOrder[dataItemField], editable: true });
break;
case "KPI_CLASS_DISPLAY_NAME":
columns.push({ field: dataItemField, title: "KPI", width: 200, locked: true, headerAttributes: { style: "text-align: left" }, order: columnOrder[dataItemField],editable:true });
break;
case "DOI":
columns.push({ field: dataItemField, title: "Daily Opertor Input", width: 200, headerAttributes: { style: "text-align: left" }, order: columnOrder[dataItemField], editable: !isEditable });
break;
case "ENS":
columns.push({ field: dataItemField, title: "ENS Input", width: 200, headerAttributes: { style: "text-align: left" }, order: columnOrder[dataItemField], editable: !isEditable });
break;
default:
if (columnOrder.hasOwnProperty(dataItemField)) {
columns.push({
field: dataItemField,
title: colTitle,
width: 120,
headerAttributes: { style: "text-align: center;white-space: normal" },
attributes: { style: "text-align: center" },
order: columnOrder[dataItemField],
editable: !isEditable
//template: "<div><input " + isdisable + " type='textbox' onchange='javascript:SaveSteerRow(\"" + colTitle + "\", #:Steer_ID#,this)' value='#:" + dataItemField + "#' > </input> <div id='spn#:Steer_ID#" + dataItemField + "'></div></div>"
});
}
else {
if (NoDisplayColumns.includes(dataItemField))
break;
columns.push({
field: dataItemField,
title: colTitle,
width: 120,
hidden: true,
headerAttributes: { style: "text-align: center;white-space: normal" },
attributes: { style: "text-align: center" },
order: columnOrder[dataItemField],
editable: !isEditable
//template: "<div><input " + isdisable + " type='textbox' onchange='javascript:SaveSteerRow(\"" + colTitle + "\", #:Steer_ID#,this)' value='#:" + dataItemField + "#' > </input> <div id='spn#:Steer_ID#" + dataItemField + "'></div></div>"
});
}
break;
}
// increment the counter so we know when we are done with fixed columns
columnIndex += 1;
}
return columns;
}
function SaveSteerRow(colName, steerId, txtBox) {
if (txtBox.checked) {
txtBox.value = '1';
}
else {
txtBox.value = '0';
}
var fd = new FormData();
fd.append("steerId", steerId);
fd.append("colName", colName);
var id = "spn" + userId + colName.replace(' ', '_');
$.ajax({
async: true,
type: "POST",
url: "/MarginSteerConstraint/UpdateSnapShot",
beforeSend: function (xhr) {
$("#" + id).html("Saving...");
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
data: fd,
contentType: false,
processData: false,
success: function (response) {
$("#" + id).html("");
console.log('UpdateSnapShot - Success');
},
error: function (e) {
$("#" + id).html("Error...");
console.log("Error Logged : ")
console.log(e);
}
});
}
var grid;
function LoadSnapShotGrid() {
var siteId = selectedSnapSite.SiteType == "Unit" ? selectedSnapSite.SiteHierarchyId : selectedSnapSite.ID;
$("#grdSnap").html("");
$.ajax({
'async': true,
'type': "GET",
'global': false,
'url': "/MarginSteerConstraint/ReadSnapShot",
'data': { 'request': "", 'siteType': selectedSnapSite.SiteType, 'ID': siteId, 'target': 'arrange_url', 'method': 'method_target' },
'success': function (response) {
console.log('ReadSnapShot - Success');
snapShotData = JSON.parse(response.SnapShot);
var isEditable = response.IsEditable;
generateGrid(snapShotData, isEditable);
//kendo.ui.progress(windowWidget.element, false);
}
});
//bindSaveButtonEvent();
}
function bindSaveButtonEvent() {
// Unbind any existing event handlers to avoid multiple bindings
$("#grdSnap").off("click", ".k-grid-save-changes");
// Bind the event handler for the "save" button
$("#grdSnap").on("click", ".k-grid-save-changes", function () {
// Code to handle the button click event
var grid = $("#grdSnap").data("kendoGrid");
grid.dataSource.sync();
});
}
LoadSnapShotGrid();
function generateModel(gridData) {
var model = {};
model.id = "STEER_ID";
model.id = "KPI_SITE_HIERARCHY_ID";
model.id = "KPI_CLASS_GROUP_CODE";
var fields = {};
for (var property in gridData) {
//if (property.indexOf("ID") !== -1) {
// model["id"] = property;
//}
var propType = typeof gridData[property];
if (propType === "number") {
fields[property] = {
type: "number",
//validation: {
// required: true
//}
};
if (model.id === property) {
fields[property].editable = false;
//fields[property].validation.required = false;
}
} else if (propType === "boolean") {
fields[property] = {
type: "boolean"
};
} else if (propType === "string") {
var parsedDate = kendo.parseDate(gridData[property]);
if (parsedDate) {
fields[property] = {
type: "date"
//validation: {
// required: true
//}
};
isDateField[property] = true;
} else {
fields[property] = {
type: "string"
//validation: {
// required: true
//}
};
}
} else {
fields[property] = {
//validation: {
// required: true
//}
};
}
}
model.fields = fields;
return model;
}
// function takes the JSON data, and dynamically produces a column set, the data schema and binds the grid
function generateGrid(gridData, isEditable) {
var model = generateModel(gridData[0]);
console.log(model);
var columns = generateMarginSnapshotColumns(gridData[0], isEditable);
console.log(columns);
// set up the grid
grid = $("#grdSnap").kendoGrid({
toolbar: ["save","cancel","excel"],
excel: {
fileName: "MarginSteerSnapshot",
filterable: true
},
dataSource: {
data: gridData,
pageSize: 20,
autoSync: false,
schema: {
model: model
},
transport: {
read: function (options) {
options.success(gridData);
},
update: function (options) {
debugger;
var fd = new FormData();
fd.append("steerData", kendo.stringify(options.data));
//alert(kendo.stringify(options.data));
$.ajax({
url: "/MarginSteerConstraint/UpdateSnapShot",
//dataType: "json",
type: "POST",
contentType: false,
processData: false,
beforeSend: function (xhr) {
// $("#" + id).html("Saving...");
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
data: fd,
success: function (response) {
// Handle the success response
console.log(response);
options.success(response); // Notify the transport that the update was successful
},
error: function (xhr, status, error) {
// Handle the error response
console.error(error);
options.error(xhr, status, error); // Notify the transport about the error
}
});
}
},
parameterMap: function (options, operation) {
if (operation === "update") {
console.log("in parameter map");
console.log(JSON.stringify(options.data));
//var updatedData = options.data; // Get the updated data object
//alert(updatedData);
//// Convert the updatedData object to JSON
//var SnapShot = kendo.stringify(updatedData);
// Create a dynamic object to send to the controller method
//var SnapShotViewModel = {
// "SnapShot": kendo.stringify(options.data),
// "isEditable": true
//};
// Convert the dynamicObject to JSON
//var dynamicJson = JSON.stringify(SnapShotViewModel);
return JSON.stringify(options.data);
}
}
},
pageable: {
refresh: true,
pageSizes: [20,50,100, 200, "all"],
},
columnMenu: true,
columns: columns,
sortable: true,
filterable: true,
width: "auto",
resizable: true,
editable: "incell",
batch:true,
serverOperation :false,
pageSize: 20
});
}
UI:
<div>
<div>
<div id="grdSnap"></div>
</div>
</div>
Controller:
[HttpPost]Hello, I have a problem with integrating the Kendo().Stepper() into my application. When I tried to add it in, the progress meter does not align with each point. Any idea of what causes this and how can I solve this?
Hello, I have a grid I am using to display detail info on a view. The columns .ClientTemplate logic works fine in a View.
However, the client wants the detail view to be displayed as a Modal Window over the summary listing. I have this working as a PartialView however the logic in the .ClientTemplate does not work in the Modal windows.
This is the working Code in the view. The highlighted section is the ClientTemplate that DOES NOT work when rendered as a PartialView in the Modal window.
@(Html.Kendo().Grid(Model.claimDetails)
.Name("Grid")
.Columns(columns =>
{
columns.Bound(p => p.Ln).ClientTemplate(
"# if (Ln == '0') { #" +
"Total Chrg" +
"# } else { #" +
"Line #= Ln #" +
"# } #"
);
columns.Bound(p => p.Chrg).Format("{0:C}").Title("Charge");
columns.Bound(p => p.IncurFrm).Format("{0:MM/dd/yyyy}").Title("Svc Date").Width(130);
columns.Bound(p => p.ProcRev).Title("Proc/Revenue Code").Width(130);
columns.Bound(p => p.OCAllowed).Format("{0:C}").Title("OC allow").Width(130);
columns.Bound(p => p.OCPaid).Format("{0:C}").Title("OC Paid").Width(130);
columns.Bound(p => p.BenAmt).Format("{0:C}").Title("Benefit Amt.").Width(130);
columns.Bound(p => p.OCDedAmt).Format("{0:C}").Title("OC Ded").Width(130);
columns.Bound(p => p.CoInsurDed).Format("{0:C}").Title("Ded Amt").Width(130);
columns.Bound(p => p.CoInsur1).Format("{0:C}").Title("Coins Amt 1").Width(130);
columns.Bound(p => p.Copay).Format("{0:C}").Title("CoPay Amt");
columns.Bound(p => p.RemarkCd).Title("Remark Cd");
columns.Bound(p => p.InElig).Format("{0:C}").Title("Tot Inelig Amt");
columns.Bound(p => p.PdClmnt).Format("{0:C}").Title("Pd to Ins");
columns.Bound(p => p.PdProv).Format("{0:C}").Title("Pd to Prov");
})
.HtmlAttributes(new { style = "height: 600px;" })
.Sortable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.ServerOperation(false)
)
)
I would like if the grid rows and columns be horizontally aligned. IE rotated 90 degrees. Is this possible?
thanks
Hello all,
I have a view that contains a Kendo Grid. The grid is bound to the model, and the model is a ClaimsViewModel. The view model contains a List<Claims> and the grid is bound to the list. This currently displays a list of claims and seems to be working. I want the UI user to be able to select a single claim(row) and then view that claim detail on a detail view. I have the row selection set to single, I have the change event set to javascript that should be able to pull the claimno, and send that to an action that would pass the value to the detail view.
However, the row selection is not firing. Please help.
This is the claims View
@using ProviderPortal.ViewModels;
@using Kendo.Mvc.UI
@model ClaimsViewModel
@{
ViewBag.Title = "SearchClaims";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@(Html.Kendo().Grid(Model.Claims)
.Name("Grid")
.Events(events => events.Change("itemselected"))
.Columns(columns =>
{
columns.Bound(p => p.ClaimNo).Title("Claim #").Width(130);
columns.Bound(p => p.ServiceDt).Title("Incurred From-To").Width(150);
columns.Bound(p => p.TotalCharge).Title("Total Charge").Width(130);
columns.Bound(p => p.TotalPaid).Title("Pd Amt").Width(130);
columns.Bound(p => p.Name).Title("Patient Name").Width(230);
})
.Scrollable()
.Selectable(selectable => selectable
.Enabled(true)
.Mode(GridSelectionMode.Single)
)
.PersistSelection(true)
.Navigatable()
.HtmlAttributes(new { style = "height: 700px;" })
.DataSource(dataSource => dataSource
.Server()
.Model(m => { m.Id(p => p.ClaimNo); })
)
)
<script type="text/javascript">
function itemselected(e) {
var selectedRow = this.select();
var dataItem = this.dataItem(selectedRow);
var id;
id = dataItem.ClaimNo;
window.location.href = "@Url.Action( "Claims", "DisplayClaim")" + "?ClaimID=" + id;
}
</script>
Here is the Controller
public class ClaimsController : Controller { // GET: Claims public ActionResult Index() { return View(); } [HttpPost] public ActionResult SearchClaims(string FromDt, string ToDt, string PatAcct, string policynumber, string GrpNo, string ClientCode, string ProvTaxID) { CIAWebService.CIAServiceClient wref = new CIAWebService.CIAServiceClient(); var viewModel = new ClaimsViewModel(); try { if (String.IsNullOrEmpty(ProvTaxID)) { ProvTaxID = Session["ProvTaxId"].ToString(); } var MMDarray = wref.MemberLookup("P", policynumber, "G", null, null, null, null); if (MMDarray.Length > 0) { Session.Add("MemberData", MMDarray[0]); var claimHeader = wref.ClaimHeader(Int32.Parse(MMDarray[0].SeqNum), MMDarray[0].DependentCode, MMDarray[0].DB, GrpNo, "C", null, DateTime.Parse(FromDt), DateTime.Parse(ToDt), ProvTaxID); for (int i = 1; i < claimHeader.Length; i++) { if (claimHeader[i].PatAcct == PatAcct) { viewModel.Claims.Add(BuildClaimsModel(MMDarray[0], claimHeader[i])); } } } } catch (Exception Ex) { Log4.Error("ClaimsController - SearchClaims:", Ex); ViewBag.ErrMessage = "Error: " + Ex.ToString(); } HttpContext.Session.Add("ClaimsList", viewModel.Claims); return View(viewModel); } }
and here is the view model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ProviderPortal.ViewModels
{
public class ClaimsViewModel: BaseViewModel
{
public List<ClaimData> Claims { get; set; }
public ClaimsViewModel()
{
Claims = new List<ClaimData>();
}
}
}
Hello,
I'm wondering if it's possible to bind a grid to a dynamic or anonymous model when performing a DataSource update operation. In this case, I've got a dynamic grid that is built off a DataTable. The grid is setup for in-cell editing and when I save the changes (i.e. perform the update), I wonder if there's a way to have it bind to an anonymous model for processing inside the Update controller method. Currently I can view the updated records as a FormCollection, but an anonymous model would make it easier for processing. Please advise whether it's possible, or if there's a better way to handle the updates.
Here's sample view code:
@(Html.Kendo().Grid<dynamic>()
.Name("grdCombined")
.ToolBar(toolBar =>
{
toolBar.Save();
})
.Columns(columns =>
{
foreach (System.Data.DataColumn column in Model.gridTable.Columns)
{
if(column.ColumnName == "UUID" || column.ColumnName.ToLower().Contains("_uuid")) { continue; }
if(column.ColumnName == "Name") { var cn = columns.Bound(column.ColumnName).Width(200).Filterable(ftb => ftb.Multi(false).Search(true).Enabled(true)).Title(column.ColumnName); continue; }
if(column.ColumnName.EndsWith("_Date")) { var cd = columns.Bound(column.ColumnName).Width(200).Format("{0: MM/dd/yyyy}").Title(column.ColumnName).EditorTemplateName("Date"); continue; }
if(column.ColumnName.EndsWith("_Comment")) { var cd = columns.Bound(column.ColumnName).Width(200).Title(column.ColumnName).EditorTemplateName("String"); continue; }
var c = columns.Bound(column.ColumnName).Width(200).Title(column.ColumnName);
}
})
.Editable(ed=>ed.Mode(GridEditMode.InCell))
.Navigatable()
.Scrollable(s=>s.Virtual(true))
.DataSource(ds => ds
.Ajax()
.Model(model =>
{
var m_id = Model.gridTable.PrimaryKey[0].ColumnName;
model.Id(m_id);
foreach (System.Data.DataColumn col in Model.gridTable.Columns)
{
var m_field = model.Field(col.ColumnName, col.DataType);
if(col.ColumnName == m_id || col.ColumnName == "Name")
{
m_field.Editable(false);
}
}
})
.Read(read=>read.Action("GridCombined_Read","Home", new { pUUID = Model.UUID }))
.Update(update=>update.Action("GridCombined_Update","Home", new { pUUID = Model.UUID})))
)
And here's the sample Update controller method:
public ActionResult GridCombined_Update([DataSourceRequest] DataSourceRequest request, FormCollection pGC, Guid pUUID) { // TODO: process the update return Json(m_Service.GridCombined_Update(pGC, pUUID).ToDataSourceResult(request)); }
I am using the Image Browser https://demos.telerik.com/aspnet-mvc/editor/imagebrowser on my Razor pages.
How do I add a feature to auto check for the Image resolution and size down to below 650 or 650px in here?
I have a preview container where the max-width I am allowed to see the preview is 650px.
but when on ImageBrowser--> Insert Window --> I have a list of uploaded images --> if i am selecting images below max size but resolution is above 650px the images on preview are too stretched out.
I know we have an option to set the width n height when inserting but how do I auto set it before I hit insert button?
I am thinking to use this:
<script>
$(document).ready(function () {
// Attach a click handler to the ImageBrowser tool of the Editor.
$(".k-i-image").click(function () {
setTimeout(function(){
// Attach a select handler to the Upload embedded in the ImageBrowser.
$(".k-imagebrowser .k-upload").find("input").data("kendoUpload").bind("select", function (e) {
// Prevent the event if the selected file exceeds the specified limit.
if (e.files[0].size > 1048576) {
e.preventDefault();
alert("Maximum allowed file size: 1MB");
}
// Check image resolution and limit width if necessary.
var img = new Image();
img.src = URL.createObjectURL(e.files[0].rawFile);
img.onload = function() {
if (img.width > 550) {
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
// Calculate new height while maintaining the aspect ratio.
var ratio = 550 / img.width;
var newHeight = img.height * ratio;
canvas.width = 550;
canvas.height = newHeight;
// Draw the image on the canvas with the adjusted dimensions.
ctx.drawImage(img, 0, 0, 550, newHeight);
// Convert the canvas content back to a Blob object.
canvas.toBlob(function (blob) {
// Replace the original file with the resized image file.
e.files[0].rawFile = blob;
}, e.files[0].type);
}
};
});
});
});
});
</script>
I am using the Kendo Editor Image Browser from : https://demos.telerik.com/aspnet-mvc/editor/imagebrowser.
Where I have hidden/removed the
1. Home icon
2.New Folder
3. Delete
4. Arrange By
5. Web Address
6. Alternate Text
using css on my local.
Is there any way to customize this without CSS?