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"
}
]
});