如何在扩展剑道树视图上加载子节点 [英] How to load child node on expand kendo treeview
问题描述
我想用PC上的文件夹和文件用nodes
创建一个treeview
.用户可以drag
和drop
nodes
.
I want to create a treeview
with nodes
from folders and files on my PC. User can drag
and drop
nodes
.
我的设计视图(cshtml):
My design view (cshtml) :
@(
Html.Kendo().TreeView()
.Name("treeview")
.Events(ev=>ev.Expand("onExpand"))
.BindTo((IEnumerable<TreeViewItemModel>)ViewBag.ParentNode)
)
我的控制器:
public class HomeController : Controller
{
public ActionResult TreeView()
{
ViewBag.ParentNode = GetDefaultNode();
return View();
}
private IEnumerable<TreeViewItemModel> GetDefaultNode()
{
List<TreeViewItemModel> defaultNode = new List<TreeViewItemModel>();
string[] drivers = Directory.GetLogicalDrives();
for (int i = 0; i < drivers.Length; i++)
{
TreeViewItemModel node = new TreeViewItemModel();
node.Text = drivers[i];
node.Url = drivers[i];
defaultNode.Add(node);
GetChildNode(node);
}
return defaultNode;
}
private void GetChildNode(TreeViewItemModel item)
{
if (Directory.Exists(item.Text))
{
try
{
string[] dirNodes = Directory.GetDirectories(item.Text);
if (dirNodes.Length > 0)
{
for (int i = 0; i < dirNodes.Length; i++)
{
TreeViewItemModel child = new TreeViewItemModel();
DirectoryInfo dirInfo = new DirectoryInfo(dirNodes[i]);
child.Text = dirInfo.Name;
child.Url = dirInfo.FullName;
child.HasChildren = true;
item.Items.Add(child);
child.Items.Add(new TreeViewItemModel());
}
}
string[] fileNodes = Directory.GetFiles(item.Text);
if (fileNodes.Length > 0)
{
for (int f = 0; f < fileNodes.Length; f++)
{
TreeViewItemModel child = new TreeViewItemModel();
FileInfo fileInfo = new FileInfo(fileNodes[f]);
child.Text = fileInfo.Name;
child.Url = fileInfo.FullName;
child.HasChildren = true;
item.Items.Add(child);
}
}
}
catch { }
}
}
}
它显示根node
和根node
的子代.
我希望子节点加载到用户扩展根目录node
上.因此,我在treeview
中声明了事件onExpand
,但是我不知道如何将当前扩展节点传递给控制器,并在视图中获取nodes
的列表,然后将其插入到当前扩展节点中.
我在此页面和Google上进行了大量搜索,但找不到解决问题的方法.
I want child nodes load on user expand root node
. So I declare events onExpand
in treeview
, but I don't know how to pass a current expand node to controller, and get a list of nodes
on view, after that insert it to current expand nodes.
I had searched a lot on this page and google, but can't find the way to solve my problems.
ps:对不起,因为我的英语不好,希望您能理解我的意思.
ps:sorry because I'm not good in English, hope you can understand my mean.
更新:
我更改为使用绑定到远程日期",但仍然没有解决我的问题.
I change to use Binding to remote date but i still have not solved my problems.
我的cshtml:
@(Html.Kendo().TreeView()
.Name("treeview")
.DataTextField("Text")
.DataUrlField("Url")
.DataSource(dataSource => dataSource
.Read(read => read
.Action("GetRoot", "Home")
)
)
)
我的控制器:
public JsonResult GetRoot()
{
return Json(GetDefaultNode(), JsonRequestBehavior.AllowGet);
}
private IEnumerable<TreeViewItemModel> GetDefaultNode()
{
List<TreeViewItemModel> defaultNode = new List<TreeViewItemModel>();
string[] drivers = Directory.GetLogicalDrives();
for (int i = 0; i < drivers.Length; i++)
{
TreeViewItemModel node = new TreeViewItemModel();
node.Text = drivers[i];
node.Url = drivers[i];
defaultNode.Add(node);
GetChildNode(node);
}
return defaultNode;
}
private void GetChildNode(TreeViewItemModel item)
{
if (Directory.Exists(item.Text))
{
try
{
string[] dirNodes = Directory.GetDirectories(item.Text);
if (dirNodes.Length > 0)
{
for (int i = 0; i < dirNodes.Length; i++)
{
TreeViewItemModel child = new TreeViewItemModel();
DirectoryInfo dirInfo = new DirectoryInfo(dirNodes[i]);
child.Text = dirInfo.Name;
child.Url = dirInfo.FullName;
item.Items.Add(child);
}
}
string[] fileNodes = Directory.GetFiles(item.Text);
if (fileNodes.Length > 0)
{
for (int f = 0; f < fileNodes.Length; f++)
{
TreeViewItemModel child = new TreeViewItemModel();
FileInfo fileInfo = new FileInfo(fileNodes[f]);
child.Text = fileInfo.Name;
child.Url = fileInfo.FullName;
item.Items.Add(child);
}
}
}
catch { }
}
}
这是结果:
如您所见,它仅显示root nodes
而没有child nodes
.当我调试时,根节点包含子节点
As you see, it only show root nodes
without child nodes
.When i debug, root nodes contain childs
推荐答案
问题已解决.使用远程数据绑定时,节点仅加载在同一级别上.当onExpand触发时,它将再次调用方法GetNodes.
Problems solved. When using remote databinding, nodes only load on the same level.When onExpand fire, it will call method GetNodes again.
public JsonResult GetNodes(string id)
{
List<Node> node = new List<Node>();
List<string> drivers=new List<string>();
if (string.IsNullOrEmpty(id))
{
drivers.AddRange(Directory.GetLogicalDrives());
}
else
{
if(Directory.Exists(id))
drivers.AddRange(Directory.GetDirectories(id));
}
try
{
for (int i = 0; i < drivers.Count; i++)
{
Node item = new Node();
DirectoryInfo dirInfo = new DirectoryInfo(drivers[i]);
item.id = dirInfo.FullName;
item.Name = dirInfo.Name;
item.hasChildren = HasNodes(drivers[i]);
node.Add(item);
}
}
catch { }
return Json(node, JsonRequestBehavior.AllowGet);
}
这篇关于如何在扩展剑道树视图上加载子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!