Kendo UI Grid with Cascading DropDownList

后端 未结 3 1430
暖寄归人
暖寄归人 2021-02-06 06:17

I have a Kendo UI Grid on my Razor Layout which fetches data from the controller.

In this grid I wish to have a set of 3 DropDownLists which are:

ProductGr

相关标签:
3条回答
  • 2021-02-06 07:07

    The easiest way would be to use the cascading dropdownlists: http://demos.kendoui.com/web/dropdownlist/cascadingdropdownlist.html inside of the editor templates for each of these columns.

    If you are using popup editing you might consider customizing the popup menu like here: http://www.kendoui.com/code-library/mvc/grid/custom-popup-editor.aspx

    If you are using InLine editing you should use this approach to customize the editor templates: http://docs.kendoui.com/documentation/getting-started/using-kendo-with/aspnet-mvc/helpers/grid/editor-templates

    If you are using InCell - lets just say its not possible.

    0 讨论(0)
  • 2021-02-06 07:12

    Here is what I've done for GridEditMode.InCell. I have Client and Fund, each client have own list of Funds, so when user select client I need to only show Funds specific to this client

    View: Kendo Grid UI setup

        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 user click on Fund you need to perform filtering of the datasource for funds, you do it on "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>
    

    Fund has "FundForeighKeyEditor" editor template, which you have to add in to Views\Shares\EditorTemplate folder. You can use any name, just make sure name of the file template matches name of the EditorTemplateName. In my case I used "FundForeignKeyEditor" as 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 a FundViewModel, it contains ClientId so I can perform filtering on it

    public class FundViewModel
    {
        public string Id { get; set; }
        public string ClientId { get; set; }
        public string Description { get; set; }
    }
    
    0 讨论(0)
  • 2021-02-06 07:18

    This works with Inline edit mode. I haven't tried any others yet.

    Tie into the change event of the first drop down, find the target drop down, and change its datasource. data-selector-type is an attribute I add to each drop down in the cascade chain to make the select easy.

    function clientDropDownEditor(container, options) {           
      var clientCombo = $('<input  id="client' + options.uid + '"  data-selector-type="client" data-text-field="Name" data-value-field="Name" data-bind="value:' + options.field + '"/>')
          .appendTo(container)
          .kendoComboBox({
              dataTextField: "Name",
              dataValueField: "Name",
              dataSource: {
                  transport: {
                      read: "json/data/getClients"
                  }
              },
              change: function (e) {
                  // Find the element with the required selector type in the same TR
                  var kendoComboSites = e.sender.element.closest("tr").find("[data-selector-type=site]").data("kendoComboBox");
    
                  kendoComboSites.dataSource.transport.options.read.url = "json/data/GetClientSites/" + e.sender.element.val() + "/" + $("#Id").val();
                  kendoComboSites.dataSource.read();
                  kendoComboSites.refresh();
    
              }
          }).data("kendoAutoComplete");
    }
    
    0 讨论(0)
提交回复
热议问题