or
@(Html.Kendo().Grid<field>() .Name("myGrid") .HtmlAttributes(new { @class = "ignore" }) .ToolBar(toolbar => { if (pnlViewUserAccess == PageViewType.Edit || pnlViewUserAccess == PageViewType.Create) { toolbar.Create().HtmlAttributes(new { @class = "ignoreDirty" }); toolbar.Save(); } }) .Editable(editable => editable.Mode(GridEditMode.InCell)) .Scrollable(s => s.Height("auto")) .Columns(columns => { columns.Bound(p => p.key).Title("Key"); columns.Bound(p => p.label); columns.ForeignKey(p => p.fieldType, (System.Collections.IEnumerable)ViewData["FieldTypes"], "Value", "Text").Title("Field Type"); columns.Bound(p => p.valueLength).Title("Field Length"); columns.ForeignKey(p => p.searchable, (System.Collections.IEnumerable)ViewData["TrueFalse"], "Value", "Text").Title("Searchable"); columns.ForeignKey(p => p.access, (System.Collections.IEnumerable)ViewData["Access"], "Value", "Text").Title("Access"); columns.ForeignKey(p => p.active, (System.Collections.IEnumerable)ViewData["TrueFalse"], "Value", "Text").Title("Enabled"); columns.Bound(p => p.order).Title("Order"); }) .DataSource(dataSource => dataSource .Ajax() .Batch(true) .ServerOperation(false) .PageSize(40) .Model(model => { model.Id(p => p.oid); model.Field(x => x.key).Editable(false); model.Field(x => x.active).DefaultValue(true); model.Field(x => x.searchable).DefaultValue(false); model.Field(x => x.access).DefaultValue(3); }) .Events(e => e.Error("handleAjaxError")) .Update(update => update.Action("FieldDef_Update", "Forms")) .Create(update => update.Action("FieldDef_Create", "Forms")) .Read(read => read.Action("FieldDef_Read", "Forms", new { recordTypeOid = Model.Entity.Oid })) ))
I then had a requirement to be able to 'order' and save the order of the rows. I decided to use the Sortable - again this was fine I could drag the rows and then on the onChange event of Sortable I updated the Grid datasource Order numbers. All good!
However when I attempt to edit a cell I run into problems which I'll detail below:
On the Sortable widget I tried different variations of .Filter(), .Handler() etc.. but couldnt get it working properly. My Sortable code is below:
@(Html.Kendo().Sortable() .For("#myGrid") .ContainerSelector("#myGrid tbody") .Filter("table > tbody > tr") .Cursor("move") //.Handler(".isSortable") //.HintHandler("noHint") .PlaceholderHandler("myGrid_placeHolder") .Events(events => events.Change("myGrid_onChange")))
@{ var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string fundsJson = serializer.Serialize(Model.Funds);}<script id="dropdown-template" type="x-tmpl-mustache"> <input type="hidden" name="[{{index}}].IndexInXml" value="{{indexInXml}}" /> <input id="_{{index}}__FundId" name="[{{index}}].FundId" style="width: 300px" type="text" /> {{attachComboBox}}</script><script> var currentDropDownIndex = 0; var fundsJson =@Html.Raw(fundsJson)@(";") function attachDropDown(dropDownIndex) { jQuery("#_" + dropDownIndex + "__FundId").kendoDropDownList( { "dataSource": fundsJson, "dataTextField": "FundName", "height": 250, "headerTemplate": "<div class=\"dropdown-header\"><span class=\"k-widget k-header\">Fund</span><span class=\"k-widget k-header\">Reg</span></div>", "template": "<span class=\"k-state-default\">#: data.FundName #</span><span class=\"k-state-default\">#: data.Reg #</span>", "valueTemplate": "<span>#:data.FundName#</span>", "dataValueField": "FundId", }); } function getDropDown(indexInXml) { var view = { index: currentDropDownIndex, indexInXml: indexInXml, attachComboBox: function () { (function (currentDropDownIndex) { jQuery(function () { console.log(currentDropDownIndex); attachDropDown(currentDropDownIndex); }); })(currentDropDownIndex); } }; var template = $('#dropdown-template').html(); Mustache.parse(template); var rendered = Mustache.render(template, view); currentDropDownIndex++; return rendered; } function init() { currentDropDownIndex = 0; }</script>@(Html.Kendo().Grid<Administration.ViewModels.UnmappedFundInfoViewModel>(Model.ImportedFundData) .Name("funds-mapping") .Sortable() .Columns(columns => { columns.Bound(c => c.ImportedFundName) .Title("Imported fund name"); columns.Bound(c => c.FundId).Title("Fund ID").Width(100); columns.Template(@<text> </text>).Title("Linked fund").ClientTemplate("#= getDropDown(data.IndexInXml)#"); }) .Scrollable(x => x.Enabled(true).Height("250px")) .DataSource(dataSource => dataSource.Ajax().ServerOperation(false) ) .Resizable(resize => resize.Columns(true)) )<script> $(document).ready(function () { var grid = $("#funds-mapping").data("kendoGrid"); grid.bind("dataBinding", function () { init(); }); });</script>@(Html.Kendo().Grid<dynamic>()
....DataSource(d =>{ d.Ajax() .Model(m => { m.Id("Id"); m.Field("Name", typeof(string)).Editable(false);[RuntimeBinderException: 'object' does not contain a definition for 'Name'] CallSite.Target(Closure , CallSite , Object ) +152 System.Dynamic.UpdateDelegates.UpdateAndExecute1(CallSite site, T0 arg0) +662 lambda_method(Closure , Object ) +133 Kendo.Mvc.UI.Html.GridDataCellBuilder`2.AppendCellContent(IHtmlNode td, Object dataItem) +131 Kendo.Mvc.UI.Html.GridDataCellBuilderBase.CreateCell(Object dataItem) +230@(Html.Kendo().Grid(Model.Result.Data) .Name("gridSearchResults") .Columns(columns => { foreach (System.Data.DataColumn column in Model.Result.Data.Columns) { if (column.ColumnName != "Id") { if (column.ColumnName == "Name") { columns.Bound("Name").Template(@<text><a href='" + Url.Action("Details", Model.Result.DataSource) + "/#= Id #'" + ">#= Name #</a></text>); } else { columns.Bound(column.ColumnName); } } } }) .DataSource(d => d .Server() .Model(m => { m.Id("Id"); foreach (System.Data.DataColumn column in Model.Result.Data.Columns) { m.Field(column.ColumnName, column.DataType); } }) ))@(Html.Kendo().Grid<Reports.ReportRow>() .Name("grdReport") .DataSource(dataSource => dataSource .Ajax() .Read(read => read .Action("AJAX", "Report") .Data("GetReportParms") ) ) .ToolBar(tools => { tools.Excel(); tools.Template(@<text> <div class="toolbar"> <label class="category-label" for="category">Version:</label> @(Html.Kendo().DropDownList() .Name("ddlField") .DataTextField("Text") .DataValueField("Value") .AutoBind(true) .Events(e => e.Change("fieldChange")) .DataSource(ds => { ds.Read("FieldType", "Common"); }) ) </div> </text>); })