是否有一种填充树视图的方法,包括父文件的子文件夹?我的代码只能查看其父文件夹中的文件,但只有在子文件夹中才能查看它。
主要问题:我在MapPath
这是我的,到目前为止它只获得父节点,它没有得到父亲的子文件夹:
protected void Page_Load(object sender, EventArgs e)
{
TreeView1.Nodes[0].Value = Server.MapPath("~/Files");
}
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
if (e.Node.ChildNodes.Count == 0)
{
DirectoryInfo directory = null;
directory = new DirectoryInfo(e.Node.Value);
foreach (DirectoryInfo subtree in directory.GetDirectories())
{
TreeNode subNode = new TreeNode(subtree.Name);
subNode.Value = subtree.FullName;
try
{
if (subtree.GetDirectories().Length == 0 | subtree.GetFiles().Length == 0)
{
subNode.SelectAction = TreeNodeSelectAction.SelectExpand;
subNode.PopulateOnDemand = true;
subNode.NavigateUrl = "";
}
}
catch
{
}
e.Node.ChildNodes.Add(subNode);
}
foreach (FileInfo fi in directory.GetFiles())
{
TreeNode subNode = new TreeNode(fi.Name);
e.Node.ChildNodes.Add(subNode);
subNode.NavigateUrl = "Files/" + fi.Name;
}
}
}
答案 0 :(得分:1)
您的代码完全没有问题。我进行了一次测试,它就像一个魅力。所以,要指出的一些事情在你的问题中并不完全清楚。
您需要将TreeView1_TreeNodePopulate
挂钩到TreeView
控件。你可以从标记声明地做到这一点......
<asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate">
或者,从代码背后隐含地......
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
TreeView1.TreeNodePopulate += TreeView1_TreeNodePopulate;
}
否则此事件处理程序永远不会被命中
除挂钩OnTreeNodePopulate
事件外,您还需要从标记中添加至少一个节点,并将其PopulateOnDemand
属性设置为true ...
<Nodes>
<asp:TreeNode PopulateOnDemand="true" Text="Root"></asp:TreeNode>
</Nodes>
如果您未设置此属性,则此事件永远不会被触发。添加这个&#34; root&#34;的另一个原因节点是为了避免IndexOutOfRangeException
或NullReference
例外...
TreeView1.Nodes[0].Value = Server.MapPath("~/Files");
记住这一切,它应该可以正常工作
单击树节点时,我没有注意到您要打开文件的位置。这是因为您在创建和添加节点时传递了URL。基本上我建议不要在页面加载时使用Server.MapPath
,只添加虚拟服务器路径...
TreeView1.Nodes[0].Value = "~/Files";
然后在创建Server.MapPath
对象时使用DirectoryInfo
...
directory = new DirectoryInfo(Server.MapPath(e.Node.Value));
并通过附加父值来设置树节点的值(在&#34;目录&#34;迭代中)...
subNode.Value = string.Format("{0}/{1}", e.Node.Value, subtree.Name);
最后,在&#34;文件&#34;迭代,设置节点的NavigateUrl
属性,如下所示......
subNode.NavigateUrl = string.Format("{0}/{1}", e.Node.Value, fi.Name);
这应该会在文件节点中为您提供正确的链接。请注意,这类似于使用Web浏览器发出http请求,请求将由IIS和ASP.NET管道处理...这意味着您将只能看到IIS可以处理的文件默认(例如图像等)