Hi,
First of all, let me congratulate you about these really nice set of controls, methods and properties !
Great work.
Now, about what brings me here is the following :
Situation :
One grid, inline row editing, server sorting, server paging
4 columns : 3 string, 1 bool
Straight forward.
$(document).ready(function(){ $("#gridStatus").kendoGrid({ dataSource: { transport: { read: "/content/reference_tables/status/json.status.list.php", update: { url: "/content/reference_tables/status/json.status.update.php", type: "POST" }, destroy: { url: "/content/reference_tables/status/json.status.delete.php", type: "POST" }, create: { url: "/content/reference_tables/status/json.status.create.php", type: "POST" } }, error: function(e) { alert(e.responseText); }, schema: { data: "data", total: "total", model: { id: "id", fields: { table_name: { type: "string", validation: { required: true} }, status_name: { type: "string", validation: { required: true} }, description: { type: "string", validation: { required: true} }, active: { type: "boolean" } } } }, pageSize: 10, serverPaging: true, serverSorting: true, sort: { field: "table_name", dir: "asc" } }, sortable: { mode: "single", allowUnsort: false }, pageable: true, editable: "inline", toolbar: ["create"], columns: [{ field: "table_name", title: "Table", width: "25%" }, { field: "status_name", title: "Name", width: "20%" }, { field: "description", title: "Description", width: "35%" }, { field: "active", title: "Active", width: "100px", template: "<div align=center>#= active #</div>" }, { command: ["edit", "destroy"], title: " ", width: "210px" } ] });});
Working situation :
All string columns are edited as a textbox. Works fine, row is updated, .. nice and smooth as designed.
In fireBug, on updating, I see that the update PHP page is called as it has to be.
Not working :
But the issue happens when I turn the first row editing is a drop down list
(...)
columns: [{ field: "table_name", title: "Table", editor: tableNameDropDownEditor, width: "25%" }, { field: "status_name", title: "Name", width: "20%" }, { field: "description", title: "Description", width: "35%" }, { field: "active", title: "Active", width: "100px", template: "<div align=center>#= active #</div>" }, { command: ["edit", "destroy"], title: " ", width: "210px" } ]});function tableNameDropDownEditor(container, options){ $.ajax({ url: "/content/reference_tables/status/json.status.table_names.php", dataType: 'json', success: function(items) { $('<input id="idEditDropDown" data-bind="value:' + options.field + '"/>') .appendTo(container) .kendoDropDownList({ dataSource: items, dataTextField: "table_name", dataValueField: "table_name" }); $("#idEditDropDown").data('kendoDropDownList').value(options.model.table_name); }, error: function(data){ console.log('error occured loading the JSON'); } });}
This is the JSON returned by json.status.table_names.php :
(returns the list of the database table names filtered (select * except the one starting with .. bla bla and bla bla) )
[{"table_name":"audit_create"},{"table_name":"audit_visible"},{"table_name":"links"},{"table_name":"links_activity"},{"table_name":"msg_content"},{"table_name":"msg_flow"},{"table_name":"msg_status"},{"table_name":"ratings"},{"table_name":"shortlists"},{"table_name":"site_settings"},{"table_name":"users"},{"table_name":"vendor_websites"},{"table_name":"vendors"},{"table_name":"visitors"},{"table_name":"visitors_history"}]
Looks fine as the drop down populates the list.
So far so good, list is populated.
BUT .. the problem is that when I want to UPDATE the row !
As soon as I put a drop down list component, it does not update at all !
FireBug does not event show me the update PHP page called. It acts as no data has changed so it does not trigger the update process.
I am probably missing some things in the definition of the drop down ...
I tried with fixed values instead of filling it in with JSON .. but same behavior
If you please could assist a bit. It is propably a piece of cake but this starts to drive me crazy ;-)
Any help is welcome, obviously.
Wbr,
/Olivier
<div id="example" class="k-content"> <p> <label for="categories">Catergories:</label> <input id="categories" /> </p> <p> <label for="products">Products:</label> <input id="products" disabled="disabled" /> </p> <p> <label for="orders">Orders:</label> <input id="orders" disabled="disabled" /> </p> <style scoped> .k-readonly { color: gray; } </style> <script> $(document).ready(function () { var productsDataSource = new kendo.data.DataSource({ serverFiltering: true, transport: { read: { url: "WebForm1.aspx/GetProductsList", //specify the URL which data should return the records. This is the Read method of the Products.asmx service. contentType: "application/json; charset=utf-8", // tells the web method to serialize JSON type: "POST" //use HTTP POST request as the default GET is not allowed for web methods }, parameterMap: function (options) { return JSON.stringify(options); } }, schema: { // the data which the data source will be bound to is in the "results" field data: "d" } }); var ordersDataSource = new kendo.data.DataSource({ serverFiltering: true, transport: { read: { url: "WebForm1.aspx/GetOrdersList", //specify the URL which data should return the records. This is the Read method of the Products.asmx service. contentType: "application/json; charset=utf-8", // tells the web method to serialize JSON type: "POST" }, parameterMap: function (options) { return JSON.stringify(options); } }, schema: { // the data which the data source will be bound to is in the "results" field data: "d" } }); $("#categories").kendoComboBox({ placeholder: "Select category...", dataTextField: "CategoryName", dataValueField: "CategoryID", dataSource: { serverFiltering: true, transport: { read: { url: "WebForm1.aspx/GetCategoryList", //specify the URL which data should return the records. This is the Read method of the Products.asmx service. contentType: "application/json; charset=utf-8", // tells the web method to serialize JSON type: "POST" //use HTTP POST request as the default GET is not allowed for web methods }, parameterMap: function (options) { return JSON.stringify(options); } }, schema: { // the data which the data source will be bound to is in the "results" field data: "d" } }, change: function () { var value = this.value(); if (value) { value = parseInt(value); if (isNaN(value)) { return; } products.data("kendoComboBox").dataSource.filter({ field: "ProductID", operator: "eq", value: parseInt(value) }); products.enable(); } else { products.enable(false); } products.value(""); orders.value(""); orders.enable(false); } }) var products = $("#products").kendoComboBox({ autoBind: false, placeholder: "Select product...", dataTextField: "ProductName", dataValueField: "ProductID", dataSource: productsDataSource, change: function () { var value = this.value(); if (value) { value = parseInt(value); if (isNaN(value)) { return; } ordersDataSource.filter({ field: "ProductID", operator: "eq", value: parseInt(value) }); orders.enable(); } else { orders.enable(false); } orders.value(""); } }).data("kendoComboBox"); var orders = $("#orders").kendoComboBox({ autoBind: false, placeholder: "Select order...", dataTextField: "OrderID", dataValueField: "OrderID", dataSource: ordersDataSource }).data("kendoComboBox"); }); </script> </div>[WebMethod] public static IEnumerable GetCategoryList() { return dbContext.Categories.Select(e => new { CategoryID = e.CategoryID, CategoryName=e.CategoryName }).ToArray(); } [WebMethod] public static IEnumerable GetProductsList(int filter) { return dbContext.Products.Select(e => new { ProductID = e.ProductID, ProductName = e.ProductName, CategoryID = e.CategoryID }).ToArray(); } [WebMethod] public static IEnumerable GetOrdersList(int filter) { return dbContext.Orders.Select(e => new OrderViewModel { OrderID = e.OrderID, OrderName = e.OrderID, ProductID = e.ProductID }).ToArray(); } } public class ProductViewModel { public int ProductID { get; set; } public string ProductName{ get; set; } [ScriptIgnore] public int CategoryID { get; set; } } public class OrderViewModel { public int OrderID { get; set; } public int OrderName{ get; set; } [ScriptIgnore] public int ProductID { get; set; } } var pagesize = $("#PageSizeSelect").data("kendoDropDownList").value(); alert("page size is now: " + pagesize); searchData.pageSize(parseInt(pagesize));// makes a second request - which works and has the new pagesize set // searchData is a kendo dataSource object searchData.read(searchBox);
var dataSourceStatistics = new kendo.data.DataSource({ batch: true, transport: { read: { data: { f:'getOrderSuggestion' } } }, schema: { data: function(data) { return data.result.custStats.Record; }, total: function(data) { return data.result.custStats.Record.length; }, model:{ // TODO: id should be EmployeeId id: "Employee", fields: { Employee: { }, EmployeeId: { }, ValueCultureAndExercise: { type: "number", defaultValue: "0", validation: { } }, ValueExercise: { type: "number", defaultValue: "0" }, Company: { editable: false, defaultValue: function() { return "apa"; } }, CompanyNo: { editable: false }, Department: { }, Total: function () { return this.ValueExercise * 10; } } } }});$("#orderGrid").kendoGrid({ dataSource: dataSourceStatistics, editable: { update: true, destroy: true }, sortable: true, selectable: true, toolbar: [{name: "create", text: "Lägg till rad"}], columns: [ { field: "Employee", title: "Namn" }, { field: "EmployeeId", title: "Anställningsnummer" }, { field: "ValueExercise", title: "Värde träning" }, { field: "ValueCultureAndExercise", title: "Värde träning och kultur" }, { field: "null", title: "Totalt", template: "#= ValueCultureAndExercise + ValueExercise#" }, { command: "destroy", title: "Ta bort" } ]});