Initialize DropDownList in the TreeView Template

Environment

Product TreeView for ProgressĀ® Kendo UIĀ®

Description

How can I place DropDownLists in the <script> of the TreeView template which will be populated from database and provide each DropDownList with a dynamically assigned id?

Solution

  • If you use the Kendo UI MVVM framework, initialize the DropDownLists with the data- attribute in the template.
  • Alternatively, initialize the widgets with JavaScript in the dataBound event of the TreeView.
<div id="example">
  <div class="files"
       data-role="treeview"
       data-text-field="name"
       data-bind="source: files"
       data-template="treeview-template"
       style="height:800px;">
  </div>
</div>

<script id="treeview-template" type="text/kendo-ui-template">
    #: item.name #
    <input id="ddl-id-#:item.id#"
           data-role="dropdownlist"
           data-animation="false"
           data-text-field="ProductName"
           data-value-field="ProductID"
           data-bind="events: { open: onOpen }
                      source: dropDownSource">
</script>

<script>
  var viewModel = kendo.observable({
    onOpen: function(e) {
      setTimeout(function() {
        e.sender.open();
      }, 0);
    },
    dropDownSource: new kendo.data.DataSource({
      transport: {
        read: {
          url: "https://demos.telerik.com/kendo-ui/service/products",
          dataType: "jsonp"
        }
      }
    }),
    files: kendo.observableHierarchy([
      { name: "My Web Site", id: "one", expanded: true, items: [
        { name: "images", id: "two", expanded: true, items: [
          { name: "logo.png", id: "three" },
          { name: "my-photo.jpg", id: "four" }
        ] },
        { name: "resources", id: "five", expanded: true, items: [
          { name: "resources", id: "six" },
          { name: "zip", id: "seven" }
        ] },
        { name: "about.html", id: "eight" },
        { name: "index.html", id: "nine" }
      ] }
    ])
  });

  kendo.bind($("#example"), viewModel);
</script>
<div id="treeview" style="height:800px;"></div>

<script id="treeview-template" type="text/kendo-ui-template">
    #: item.FullName #
    <input class="drop-down" id="ddl-id-#:item.EmployeeId#"/>
</script>

<script>
  var serviceRoot = "https://demos.telerik.com/kendo-ui/service";
  var homogeneous = new kendo.data.HierarchicalDataSource({
    transport: {
      read: {
        url: serviceRoot + "/Employees",
        dataType: "jsonp"
      }
    },
    schema: {
      model: {
        id: "EmployeeId",
        hasChildren: "HasEmployees"
      }
    }
  });

  $("#treeview").kendoTreeView({
    template: kendo.template($("#treeview-template").html()),
    dataSource: homogeneous,
    dataTextField: "FullName",
    dataBound: function(e) {
      var treeViewElement = $(e.sender.element);
      var inputs = treeViewElement.find('input.drop-down');

      for(var i = 0; i < inputs.length; i++) {
        var current = $(inputs[i]);
        var dropDown = current.getKendoDropDownList();

        if (!dropDown) {
          current.kendoDropDownList({
            animation: false,
            dataTextField: "ProductName",
            dataValueField: "ProductID",
            open: function(e) {
              setTimeout(function() {
                e.sender.open();
              }, 0);
            },
            dataSource: {
              transport: {
                read: {
                  url: "https://demos.telerik.com/kendo-ui/service/products",
                  dataType: "jsonp"
                }
              }
            }
          });
        }
      }
    }
  });
</script>

See Also

In this article
Not finding the help you need? Improve this article