Here is what I did for GridEditMode.InCell. I have a Client and a Fund, each client has its own list of funds, so when a user selects a client, I only need to show funds specific to this client.
View: Customizing the Kendo Grid UI
c.ForeignKey(p => p.ClientId, Model.Clients, "Id", "ClientName") .Title("Client") .Width(100); c.ForeignKey(p => p.FundId, Model.Funds, "Id", "Description") .EditorViewData(new {funds = Model.Funds}) .EditorTemplateName("FundForeignKeyEditor") .Title("Fund") .Width(100); }) .Editable(x => x.Mode(GridEditMode.InCell)) .Events(e => e.Edit("gridEdit"))
Now, when the user clicks on Fund, you need to filter the data source for funds, you do this on the "gridEdit" event using JavaScript. You put this code in the same view / file as your code above
<script type="text/javascript"> function gridEdit(e) { var fundDropDown = e.container.find("#FundId").data("kendoDropDownList"); if (fundDropDown) { fundDropDown.dataSource.filter({ field: "ClientId", operator: "eq", value: e.model.ClientId }); </script>
The fund has a FundForeighKeyEditor editor template, which you must add to the Views \ Shares \ EditorTemplate folder. You can use any name, just make sure the name of the file template matches the name EditorTemplateName. In my case, I used "FundForeignKeyEditor" as the EditorTemplate and FundForeighKeyEditor.cshtml file
FundForeighKeyEditor.cshtml
@model FundViewModel @( Html.Kendo().DropDownListFor(m => m) .BindTo((System.Collections.IEnumerable)ViewData["funds"]) .DataTextField("Description") .DataValueField("Id") )
Here is FundViewModel, it contains ClientId, so I can filter on it
public class FundViewModel { public string Id { get; set; } public string ClientId { get; set; } public string Description { get; set; } }