【问题标题】:Populating treeview asp.net填充树视图 asp.net
【发布时间】:2014-11-01 05:56:39
【问题描述】:

有没有办法填充树视图,包括父级的子文件夹?我的代码只能查看其父文件夹中的文件,但一旦进入子文件夹就无法打开。

主要问题:当文件位于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;
        }

    }
}

【问题讨论】:

    标签: c# asp.net treeview treeviewitem


    【解决方案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>
    

    如果您不设置此属性,则永远不会触发此事件。添加此“根”节点的另一个原因是避免出现IndexOutOfRangeExceptionNullReference 异常...

    TreeView1.Nodes[0].Value = Server.MapPath("~/Files");
    

    记住所有这些,它应该可以正常工作

    根据评论编辑

    我没有注意到您说要在单击树节点时打开文件的位置。发生这种情况是因为您在创建和添加节点时传递了 url。基本上我建议不要在页面加载时使用Server.MapPath,只添加虚拟服务器路径...

    TreeView1.Nodes[0].Value = "~/Files";
    

    然后在创建DirectoryInfo 对象时使用Server.MapPath...

    directory = new DirectoryInfo(Server.MapPath(e.Node.Value));
    

    并通过附加父值的...来设置树节点的值(在“目录”迭代内)...

    subNode.Value = string.Format("{0}/{1}", e.Node.Value, subtree.Name);
    

    最后,在“文件”迭代中,设置节点的NavigateUrl 属性,如下所示...

    subNode.NavigateUrl = string.Format("{0}/{1}", e.Node.Value, fi.Name);
    

    这应该会在文件节点中为您提供正确的链接。请注意,这类似于使用 Web 浏览器发出 http 请求,并且该请求将由 IIS 和 ASP.NET 管道处理......这意味着您将只能看到可由 IIS 处理的文件默认(例如图片等)

    【讨论】:

    • 即使文件在子文件夹中也能正常工作?我的意思是在Files 内部还有另一个文件夹,我认为这是我的代码中缺少的文件夹。
    • 我的主要问题是我无法打开位于Files子文件夹中的文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多