<div class="form">
<h4>Employees</h4>
@(Html.DevExtreme().TreeView()
.ID("treeview")
.DataSource(d => d.Mvc().LoadAction("Employees"))
.ItemsExpr("Items")
.SelectedExpr("Selected")
.ExpandedExpr("Expanded")
.Width(340)
.Height(320)
.ShowCheckBoxesMode(TreeViewCheckBoxMode.Normal)
.OnSelectionChanged("syncSelection")
.OnContentReady("syncSelection")
.ItemTemplate(@<text>
<div>
<%- FullName %>
(<%- Position %>)
</div>
</text>)
)
<div class="selected-container">
Selected employees
@(Html.DevExtreme().List()
.ID("selected-employees")
.Width(400)
.Height(200)
.ShowScrollbar(ShowScrollbarMode.Always)
.ItemTemplate(@<text>
<div>
<%- Prefix %> <%- FullName %> (<%- Position %>)
</div>
</text>)
)
</div>
</div>
<div class="options">
<div class="caption">Options</div>
<div class="options-container">
<div class="option">
<span>Show Check Boxes Mode:</span>
<div class="editor-container">
@(Html.DevExtreme().SelectBox()
.ID("showCheckBoxesMode")
.InputAttr("aria-label", "Show Checkboxes Mode")
.Items(new List<string> { "selectAll", "normal", "none" })
.Value("normal")
.OnValueChanged("showCheckBoxesModeValueChanged"))
</div>
</div>
<div class="option">
<span>Selection Mode:</span>
<div class="editor-container">
@(Html.DevExtreme().SelectBox()
.ID("selectionMode")
.InputAttr("aria-label", "Selection Mode")
.Items(new List<string> { "multiple", "single" })
.Value("multiple")
.OnValueChanged("selectionModeValueChanged"))
</div>
</div>
<div class="option">
<div class="caption-placeholder"> </div>
<div class="editor-container">
@(Html.DevExtreme().CheckBox()
.ID("selectNodesRecursive")
.Text("Select Nodes Recursive")
.Value(true)
.OnValueChanged("selectNodesRecursiveValueChanged"))
</div>
</div>
<div class="option">
<div class="caption-placeholder"> </div>
<div class="editor-container">
@(Html.DevExtreme().CheckBox()
.ID("selectByClick")
.Text("Select By Click")
.Value(false)
.OnValueChanged("selectByClickValueChanged"))
</div>
</div>
</div>
</div>
<script>
function syncSelection(treeView) {
var selectedEmployees = treeView.component.getSelectedNodes()
.map(function (node) { return node.itemData; });
getSelectedEmployeesList().option("items", selectedEmployees);
}
function showCheckBoxesModeValueChanged(e) {
getTreeView().option("showCheckBoxesMode", e.value);
if(e.value === 'selectAll') {
getSelectionsModeSelectBox().option('value', 'multiple');
getRecursiveCheckBox().option('disabled', false);
}
getSelectionsModeSelectBox().option('disabled', e.value === 'selectAll');
}
function selectionModeValueChanged(e) {
getTreeView().option("selectionMode", e.value);
if(e.value === 'single') {
getRecursiveCheckBox().option('value', false);
getTreeView().unselectAll();
}
getRecursiveCheckBox().option('disabled', e.value === 'single');
}
function selectNodesRecursiveValueChanged(e) {
getTreeView().option("selectNodesRecursive", e.value);
}
function selectByClickValueChanged(e) {
getTreeView().option("selectByClick", e.value);
}
function getTreeView() {
return $("#treeview").dxTreeView("instance");
}
function getSelectedEmployeesList() {
return $("#selected-employees").dxList("instance");
}
function getSelectionsModeSelectBox() {
return $("#selectionMode").dxSelectBox("instance");
}
function getRecursiveCheckBox() {
return $("#selectNodesRecursive").dxCheckBox("instance");
}
</script>
using DevExtreme.AspNet.Data;
using DevExtreme.AspNet.Mvc;
using DevExtreme.MVC.Demos.Models.SampleData;
using System.Text.Json;
using System.Web.Mvc;
namespace DevExtreme.MVC.Demos.Controllers {
public class TreeViewController : Controller {
public ActionResult ItemSelectionAndCustomization() {
return View();
}
[HttpGet]
public ActionResult Employees(DataSourceLoadOptions loadOptions) {
var serializedEmployees = JsonSerializer.Serialize(DataSourceLoader.Load(TreeViewHierarchicalDataForSelection.Employees, loadOptions));
return Content(serializedEmployees, "application/json");
}
}
}
using System;
using System.Collections.Generic;
namespace DevExtreme.MVC.Demos.Models.TreeView {
public class Employee {
public int ID { get; set; }
public string Prefix { get; set; }
public string FullName { get; set; }
public string Position { get; set; }
public bool Expanded { get; set; }
public bool Selected { get; set; }
public IEnumerable<Employee> Items { get; set; }
}
}
using System;
using System.Collections.Generic;
using DevExtreme.MVC.Demos.Models.TreeView;
namespace DevExtreme.MVC.Demos.Models.SampleData {
public static class TreeViewHierarchicalDataForSelection {
public static readonly IEnumerable<Employee> Employees = new List<Employee> {
new Employee {
ID = 1,
FullName= "John Heart",
Prefix = "Dr.",
Position = "CEO",
Expanded = true,
Items = new List<Employee> {
new Employee {
ID = 2,
FullName= "Samantha Bright",
Prefix = "Dr.",
Position = "COO",
Expanded = true,
Items = new List<Employee> {
new Employee {
ID = 3,
FullName= "Kevin Carter",
Prefix = "Mr.",
Position = "Shipping Manager",
},
new Employee {
ID = 14,
FullName= "Victor Norris",
Prefix = "Mr.",
Selected = true,
Position = "Shipping Assistant"
}
}
},
new Employee {
ID = 4,
FullName= "Brett Wade",
Prefix = "Mr.",
Position = "IT Manager",
Expanded = true,
Items = new List<Employee> {
new Employee {
ID = 5,
FullName= "Amelia Harper",
Prefix = "Mrs.",
Position = "Network Admin"
},
new Employee {
ID = 6,
FullName= "Wally Hobbs",
Prefix = "Mr.",
Position = "Programmer"
},
new Employee {
ID = 7,
FullName= "Brad Jameson",
Prefix = "Mr.",
Position = "Programmer"
},
new Employee {
ID = 8,
FullName= "Violet Bailey",
Prefix = "Ms.",
Position = "Jr Graphic Designer",
}
}
},
new Employee {
ID = 9,
FullName= "Barb Banks",
Prefix = "Mrs.",
Position = "Support Manager",
Expanded = true,
Items = new List<Employee> {
new Employee {
ID = 10,
FullName= "Kelly Rodriguez",
Prefix = "Ms.",
Position = "Support Assistant"
},
new Employee {
ID = 11,
FullName= "James Anderson",
Prefix = "Mr.",
Position = "Support Assistant"
}
}
}
}
}
};
}
}
.form > h4 {
margin-bottom: 20px;
}
.form > div, #treeview {
display: inline-block;
vertical-align: top;
}
#selected-employees {
margin-top: 20px;
}
.selected-container {
padding: 20px;
background-color: rgba(191, 191, 191, 0.15);
margin-left: 20px;
font-size: 115%;
font-weight: bold;
}
.selected-container .dx-list-item-content {
padding-left: 0;
}
.options {
padding: 20px;
background-color: rgba(191, 191, 191, 0.15);
margin-top: 20px;
box-sizing: border-box;
}
.caption {
font-size: 18px;
font-weight: 500;
}
.option {
width: 24%;
margin-top: 10px;
margin-right: 9px;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: center;
}
.options-container {
display: flex;
justify-content: space-between;
align-items: stretch;
}
.editor-container {
height: 100%;
display: flex;
align-items: center;
}
.editor-container>*{
width: 100%;
}
.option:last-of-type {
margin-right: 0px;
}