Rebind DropDownList в KendoGrid, в зависимости от значения, выбранного в другом DropDownList в той же строке
Это распространенная проблема, но я не знаю, как это выяснить с помощью виджетов KendoUI и Javascript. У меня есть KendoGrid, источник данных которого поступает из AJAX-вызова веб-служб. Данные привязаны к столбцам. Два столбца (источник и назначение) - это два выпадающих списка:
каждый столбец определяется как
if (stringStartsWith(colTitle, 'Source')) {
columns.push({
field: dataItem.replace(/s+/g, ''),
title: colTitle,
width: 150,
locked: false,
editor: sourceDropDownEditor,
//template: "#=SourcetankIdentifier#",
attributes: { style: "text-align: left" },
type: "text"
});
}
и SourceDropDownEditor выглядит следующим образом:
function sourceDropDownEditor(container, options) {
$('<input id="sourcesDropDownList" required data-text-field="Source" data-value-field="Source" data-bind="value:' + options.field + '"/>')
.appendTo(container)
.kendoDropDownList({
dataTextField: "Source",
dataValueField: "Source",
dataSource: Sources
});
}
то же самое делается для Пунктом Выпадающего Списка.
Теперь, что я хочу, когда пользователь нажимает на кнопку редактирования (сетка определяется с помощью встроенного редактирования) и выбирает определенное исходное значение из исходного DDL; список в целевой DDL должен изменяться в соответствии с этим значением.
Я написал функцию для получения правильного списка, в зависимости от значения, выбранного в исходном DDL. Но что я не могу сделать, это получить DLL Destion этой строки и установить источник данных соответственно.
больше деталей как спрошено:
сетка строится динамически:
function generateGrid(JSONData) {
var model = generateModel(JSONData, selectedMenu);
var columns = generateColumns(model);
var data = generateData(gridData, columns);
var grid = $("#mainGrid").kendoGrid({
edit: function (e) {
..
},
dataSource: {
data: data,
schema: {
model: model
},
sort: {
field: defaultSort.replace(/s+/g, ''),
dir: "desc"
}
},
toolbar: [
..
],
columns: columns,
editable: "inline",
sortable: true,
resizable: true,
filterable: true,
selectable: "multiple",
cancel: function(e) {
$('#mainGrid').data('kendoGrid').dataSource.cancelChanges();
},
ДОДЗЕ
здесь dojo.telerik.com/uXeKa . Он отражает в основном шаблон сетки и поля столбцов
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
окончательное решение здесь:dojo.telerik.com/uXeKa/2 . Не нужно ничего добавлять в тег редактировать функция сетки. Просто нужно реализовать onChange, после функция исходного DDL, и установить источник данных назначения.
2 ответов
пожалуйста, попробуйте с приведенным ниже фрагментом кода.
<!DOCTYPE html>
<html>
<head>
<title>Jayesh Goyani</title>
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2015.3.1111/styles/kendo.common.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2015.3.1111/styles/kendo.rtl.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2015.3.1111/styles/kendo.default.min.css">
<link rel="stylesheet" href="http://kendo.cdn.telerik.com/2015.3.1111/styles/kendo.mobile.all.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2015.3.1111/js/angular.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2015.3.1111/js/jszip.min.js"></script>
<script src="http://kendo.cdn.telerik.com/2015.3.1111/js/kendo.all.min.js"></script>
</head>
<body>
<div id="grid">
</div>
<script>
var sources = [];
var destinations = [];
var products = [{
ProductID: 1,
ProductName: "Chai",
SourceID: 1,
DestinationID: 1,
}, {
ProductID: 2,
ProductName: "Chang",
SourceID: 2,
DestinationID: 1,
}, {
ProductID: 3,
ProductName: "Aniseed Syrup",
SourceID: 3,
DestinationID: 2,
}, {
ProductID: 4,
ProductName: "Chef Anton's Cajun Seasoning",
SourceID: 4,
DestinationID: 2,
}, {
ProductID: 5,
ProductName: "Chef Anton's Gumbo Mix",
SourceID: 4,
DestinationID: 2,
}];
$(document).ready(function () {
$("#grid").kendoGrid({
dataSource: {
data: products,
schema: {
model: {
id: "ProductID",
fields: {
ProductName: { type: "string" }
}
}
},
pageSize: 10
},
sortable: true,
edit: onGridEdit,
filterable: true,
pageable: {
input: true,
numeric: false
},
columns: [
{ field: "ProductName" },
{ field: "SourceID", title: "SourceID", values: sources },
{ field: "DestinationID", title: "DestinationID", values: destinations },
{ command: ["edit", "destroy"], title: " " }
],
editable: "inline"
});
});
var destinationID = 0;
function onGridEdit(arg) {
destinationID = arg.model.DestinationID;
$.ajax({
url: "http://localhost:3470/Home/GetSource",
type: 'GET',
success: function (data) {
var sourceDDL = $(arg.container).find("select[name^='SourceID']").data("kendoDropDownList");
sourceDDL.bind("change", onChange);
sourceDDL.setDataSource(data);
sourceDDL.value(arg.model.SourceID);
onChange();
}
});
}
function onChange(arg) {
var sourceid = $("select[name^='SourceID']").data("kendoDropDownList").value();
$.ajax({
url: "http://localhost:3470/Home/GetDestination",
type: 'GET',
data: { SourceID: sourceid },
success: function (data) {
var destinationDDL = $("select[name^='DestinationID']").data("kendoDropDownList");
destinationDDL.setDataSource(data);
if (arg) {
// Please uncomment below code if you want to reset ddl value on sourceDDl value change
// destinationDDL.select(-1);
}
else {
destinationDDL.value(destinationID);
destinationID = 0;
}
}
});
}
</script>
</body>
</html>
Для справки:-
public class Source
{
public int value { get; set; }
public string text { get; set; }
}
public class Destination
{
public int value { get; set; }
public string text { get; set; }
}
.....
.....
public ActionResult GetSource()
{
List<Source> list = new List<Source>();
list.Add(new Source() { value = 1, text = "cat1" });
list.Add(new Source() { value = 2, text = "cat2" });
list.Add(new Source() { value = 3, text = "cat3" });
list.Add(new Source() { value = 4, text = "cat4" });
list.Add(new Source() { value = 5, text = "cat5" });
return Json(list, JsonRequestBehavior.AllowGet);
}
public ActionResult GetDestination(int? SourceID)
{
List<Destination> list = new List<Destination>();
list.Add(new Destination() { value = 1, text = "des1_" + Convert.ToString(SourceID) });
list.Add(new Destination() { value = 2, text = "des2_" });
list.Add(new Destination() { value = 3, text = "des3_" });
list.Add(new Destination() { value = 4, text = "des4_" });
list.Add(new Destination() { value = 5, text = "des5_" });
return Json(list, JsonRequestBehavior.AllowGet);
}
Update 1: (на основе вашего редактора я обновил оператор селектора jquery)
function onGridEdit(arg) {
var sourceDDL = $(arg.container).find("input[id^='sourcesDropDownList']").data("kendoDropDownList");
}
function onChange(arg) {
var sourceid = $("input[id^='sourcesDropDownList']").data("kendoDropDownList").value();
var destinationDDL = $("input[id^='destinationsDropDownList']").data("kendoDropDownList");
}
Дайте мне знать, если какие-либо проблемы.
вы можете сделать два редактора (выпадающие списки) для исходных и целевых столбцов. Для редактора назначения вы можете использовать cascadeFrom свойство, из которых содержит идентификатор раскрывающегося списка источника. Назначение фильтруется в соответствии с выбранными параметрами в раскрывающихся списках источник. Это Kendo UI построен в функциональности, и вы можете прочитать больше формы здесь.