填充treeview asp.net

时间:2014-09-08 03:25:50

标签: c# asp.net treeview treeviewitem

是否有一种填充树视图的方法,包括父文件的子文件夹?我的代码只能查看其父文件夹中的文件,但只有在子文件夹中才能查看它。

主要问题:我在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;
        }

    }
}

1 个答案:

答案 0 :(得分:1)

您的代码完全没有问题。我进行了一次测试,它就像一个魅力。所以,要指出的一些事情在你的问题中并不完全清楚。

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;
    }

否则此事件处理程序永远不会被命中

2

除挂钩OnTreeNodePopulate事件外,您还需要从标记中添加至少一个节点,并将其PopulateOnDemand属性设置为true ...

   <Nodes>
       <asp:TreeNode PopulateOnDemand="true" Text="Root"></asp:TreeNode>
   </Nodes>

如果您未设置此属性,则此事件永远不会被触发。添加这个&#34; root&#34;的另一个原因节点是为了避免IndexOutOfRangeExceptionNullReference例外...

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可以处理的文件默认(例如图像等)