我想创建一个 treeview
与 nodes
来自我电脑上的文件夹和文件。用户可以drag
和 drop
nodes
.
我的设计 View (cshtml):
@(
Html.Kendo().TreeView()
.Name("treeview")
.Events(ev=>ev.Expand("onExpand"))
.BindTo((IEnumerable<TreeViewItemModel>)ViewBag.ParentNode)
)
我的 Controller :
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
和根的 child node
.我希望在用户扩展根目录
node
上加载子节点.所以我声明事件onExpand
在 treeview
,但我不知道如何将当前展开节点传递给 Controller ,并获取 nodes
的列表在 View 中,之后将其插入到当前展开节点。我在这个页面和谷歌上搜索了很多,但找不到解决我问题的方法。
ps:对不起,我的英文不好,希望你能理解我的意思。
更新:
我改为使用绑定(bind)到远程日期,但我仍然没有解决我的问题。
我的cshtml:
@(Html.Kendo().TreeView()
.Name("treeview")
.DataTextField("Text")
.DataUrlField("Url")
.DataSource(dataSource => dataSource
.Read(read => read
.Action("GetRoot", "Home")
)
)
)
我的 Controller :
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
.当我调试时,根节点包含子节点最佳答案
问题解决了。使用远程数据绑定(bind)时,节点仅加载在同一级别。当 onExpand 触发时,它会再次调用方法 GetNodes。
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);
}
关于c# - 如何在扩展 Kendo Treeview 上加载子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26861498/