当用户点击它进行编辑时,我想在 Kendo 网格单元格中显示一个 Kendo 下拉菜单。
这是我的代码
index.cshtml
文件网格代码
@(Html.Kendo().Grid<SvwDesignMaterialSystemAttributeDto>()
.Name("DesignMaterialSystemAttribute")
.Columns(columns =>
{
columns.Bound(m => m.MaxAcceptableValue).Hidden();
columns.Bound(m => m.MaxAcceptableText).ClientTemplate(
"# if (MaxAcceptableText) { #"
+ "#=formatValueInUnit(MaxAcceptableText, UnitTypeCode)#" + " "
+ "# } #").Title("Max").Width(100);
})
.ToolBar(toolbar =>
{
toolbar.Save();
})
.Editable(editable => editable.Mode(GridEditMode.InCell)).Pageable().Sortable()
.Events(e => e.Edit("onEdit"))
.Events(events => events.DataBound("function"))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model =>
{
model.Id(m => m.DesignMaterialSystemAttributeId);
.....
})
.Events(events => events.DataBound(
@<text>
function (e) {
if ($('#DesignMaterialSystemAttribute').data('kendoGrid').dataSource.data().length == 0) {
$("#DesignMaterialSystemAttribute").find('tbody')
.append('<tr class="kendo-data-row"><td colspan="6" style="text-align: center"><b>No Results Found!</b></td></tr>');
}
}
</text>
))
.AutoBind(true)
)
这是在标记同一文件内编辑点击事件
index.cshtml
<script id="myscript" type="text/javascript">
function onEdit(e)
{
var field = e.sender.columns[e.container.index()].field;
if (e.model.UnitTypeCode === "UNIT_LOOKUP_COMBOBOX") {
var input = $("<input id='products'/>")
$(document).ready(function() {
$("#products").kendoDropDownList({
dataTextField: "ProductName",
dataValueField: "ProductID",
dataSource: {
transport: {
read: {
dataType: "jsonp",
url: "https://demos.telerik.com/kendo-ui/service/Products",
}
}
}
});
});
var temp = $("#products");
e.container.append(input);
input.focus();
temp.remove();
kendo.bind(e.container, e.model);
}
}
</script>
我采用了上面的代码 kendo Kendo 下拉示例。当我点击单元格时,它只会在编辑模式下的网格单元格上显示
Textbox
(输入)而不是下拉列表。
这就是我想要在网格内联编辑中做下拉的方式。
在第一个链接中使用了很少的剑道样式,我添加了这些样式并在控制台中收到有关剑道订阅的警告。似乎那些款式是新发布的
2023.1.117
。我不想更新剑道订阅。我只想继续当前订阅。
如何将 Kendo 下拉列表添加到网格内联编辑模式?
编辑1:
在第二个 if 条件下我需要下拉菜单,按照第二种方法我该怎么做
<script id="myscript" type="text/javascript">
function onEdit(e)
{
var field = e.sender.columns[e.container.index()].field;
if (e.model.UnitTypeCode === "Integer") {
//other editor control
}
if (e.model.UnitTypeCode === "UNIT_LOOKUP_COMBOBOX") {
//here I need dropdown editor
}
if (e.model.UnitTypeCode === "Float") {
//other editor control
}
}
</script>
关于编辑器和编辑器模板,网格的工作方式略有不同,具体取决于使用的是 HTML 包装器还是 Kendo UI。
使用 HTML 包装器(ASP.NET Core 的 UI 或 ASP.NET MVC 的 UI)时,使用的编辑器位于 ~/Viwes/Shared/EditorTemplates 文件夹中。这些模板被序列化并作为 columns.editor 作为字符串传递,这样当单元格进入编辑模式时定义编辑器。您可以通过
EditorTemplateName
配置. 指定要使用的编辑器
使用 Kendo UI 初始化网格,您可以将 editor 设置为所需的小部件(或使用返回编辑器的函数)并使用 editorOptions 提供其他配置选项。
现在,要在使用 HTML 帮助程序时创建自定义编辑器,例如列的 DropDownList,而不是 TextBox,请遵循 自定义编辑示例 和 docs。基本上你必须:
用 [UIHint] 属性装饰模型属性:
[UIHint("ClientCategory")]
public CategoryViewModel Category {get;set;}
创建自定义编辑器并将其放在 ~/Views/Shared/EditorTemplates 文件夹中
@model Kendo.Mvc.Examples.Models.CategoryViewModel
@(Html.Kendo().DropDownListFor(m => m)
.DataValueField("CategoryID")
.DataTextField("CategoryName")
.BindTo((System.Collections.IEnumerable)ViewData["categories"]) //You can also bind to a DataSource, it's not mandatory to use local data
)
添加列定义:
columns.Bound(p => p.Category).ClientTemplate("#=Category.CategoryName#").Width(180);
ClientTemplate 配置用于显示 CategoryViewModel 的属性,否则您将在 Grid 上看到 [Object object]
现在,如果出于某种原因您不想使用 EditorTemplates 文件夹中的 EditorTemplate 并希望使用 JS 函数来初始化列的编辑器,您可以定义一个返回编辑器的函数,并在 document.ready 上使用 setOptions Grid 的方法来覆盖选项并将函数设置为 columns.editor 配置 - example
@(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.ProductViewModel>()
.Name("grid")
.AutoBind(false)
.Columns(columns => {
columns.Bound(p => p.ProductName);
...
columns.Command(command => command.Destroy()).Width(150);
})
.Editable(editable => editable.Mode(GridEditMode.InCell))
...
)
<script type="text/javascript">
function productNameEditor(container, options) {
$('<input required name="' + options.field + '"/>')
.appendTo(container)
.kendoDropDownList({
autoBind:false,
dataTextField: "ProductName",
dataValueField: "ProductName",
dataSource: {
transport: {
read: {
dataType: "json",
url: "@Url.Action("RemoteDataSource_GetProducts", "DropDownList")",
}
}
}
});
}
$("document").ready(function(){
var grid = $("#grid").getKendoGrid();
var options = grid.options;
options.columns[0].editor = productNameEditor;
grid.setOptions(options);
grid.dataSource.read();
})
</script>
编辑:
扩展第二种方法 - 也可以为每一列使用条件编辑器,您可以调用一个函数,该函数将根据您拥有的条件返回所需的编辑器。
迭代所有列并将编辑器分配给返回所需编辑器的函数。
options.field
表示当您点击单元格时将为其生成编辑器的字段,您可以通过 options.model
访问正在编辑的模型:
$("document").ready(function(){
var grid = $("#grid").getKendoGrid();
var options = grid.options;
options.columns.forEach((itm)=>itm.editor = chooseEditor)
grid.setOptions(options);
grid.dataSource.read();
})
function chooseEditor(container, options) {
switch (options.field) {
case "ProductName":
if(options.model.ProductID % 2 == 0){
dropdownEditor(container, options);
} else {
textEditor(container, options);
}
break;
case "UnitPrice":
currencyEditor(container, options);
break;
case "UnitsInStock":
numericEditor(container, options);
break;
case "OrderDate":
dateEditor(container, options);
break;
case "Discontinued":
booleanEditor(container, options);
break;
default:
textEditor(container, options);
break;
}
}
函数将返回相应的编辑器,例如:
function textEditor(container, options) {
$('<input type="text" name="' + options.field + '"/>')
.appendTo(container)
.kendoTextBox()
}
function numericEditor(container, options) {
$('<input name="' + options.field + '"/>')
.appendTo(container)
.kendoNumericTextBox()
}
因此,基于上述内容,在这个更新的示例中,单击 ProductName 列中的单元格将呈现 DropDownList 或 TextBox。