繁体   English   中英

如何在aspx页面上显示可点击目录而不动态添加控件作为子文件夹

[英]How to display clickable directories on an aspx page without dynamically adding controls as subfolders

我创建了一个 aspx 网站,它显示了一个目录,其中包含来自 FTP 服务器的内容。 如果我点击这个目录中的一个文件夹,它应该显示子目录的内容等等。

到目前为止,我所尝试的是将目录的内容显示为动态创建的 WebControls.Button。 这些按钮在后面的 c# 代码中定义了一个 onclick 事件。

这是一个坏主意,原因如下:

在回发(单击文件夹)后创建新的动态控件可防止添加到子目录按钮的任何 onclick 事件起作用。 这是因为控件需要一个唯一的 ID,事件处理才能正常工作。

让我用一个例子来解释这一点:

  • 第一页加载 -> 显示的每个目录都会获得一个 ID (1-7) 并分配一个 onclick 事件。

场景一:

  • 打开带有 ID 1 的文件夹“Europe” -> onclick 事件被触发 -> 子目录将在代码隐藏中加载,显示并获得 ID (1- ..) 和分配的 onclick 事件。

  • 打开 ID 为 1 的子文件夹“Andorra” -> onclick 事件被触发 -> 但现在父文件夹“Europe”将被打开,因为它已经有 ID 1。

场景二

  • 打开 ID 为 1 的文件夹“Europe” -> onclick 事件被触发 -> 将显示子目录,但现在我们分配新的 ID (6-..) 和 onclick 事件。

  • 使用 ID 6 打开文件夹“Andorra”-> onclick 事件不会被触发(事件机制似乎对新 ID 感到困惑)-> 而是所有添加的按钮(目录)从页面上消失。

附加信息:要知道单击了哪个按钮,我将路径保存在 Button.CommandArgument 参数中,以便代码隐藏知道从 FTP 加载哪个目录。

我真的没有更多想法如何在 asp.net 中实现一个简单的可点击目录。 我希望你能理解这场斗争,并可能有想法分享:)

好的,这就是你要做的。 让我们在空白 Web 表单上拖动一个按钮。 接下来,在树视图中拖放。

在树视图控件上,选择此选项:(自动格式)

在此处输入图片说明

现在,您不必执行上述自动格式化。 它所做的只是“设置”树视图的图标。 内置列表具有典型的项目符号或 > 等。这些是属性表中的“只是”设置。 (您可以使用自己的图标,但这会为您设置它们)。

好的,到目前为止,零代码。

现在,为我们的按钮后面的代码填充树视图。

Dim myFiles As List(Of String) = GetAllFtpFiles(fRoot, UserId, Passwrod)
Call PopulateTreeViewFiles(fRoot, myFiles, "", Nothing)

例程 GetAllFtpFiles 简单地返回给定起始文件夹中的文件列表。 所以 fRoot 将是

"ftp://ftp.mywebsite/startingFolder/"  (we do assume trailing /)

然后我们调用 PopulateTreeViewFiles。 它所做的只是添加了基本文件列表。 现在我们可以填充整个树,但这可能需要一些时间,所以我们只在点击时填充文件夹。

因此,GetAllFtpFiles 简单返回一个文件列表。 我相信你已经有了自己的 FTP 文件获取/抓取/获取例程,但这是我使用的一个:

Private Function GetAllFtpFiles(ByVal ParentFolderpath As String, UserId As String, Password As String) As List(Of String)
    Try
        Dim ftpRequest As FtpWebRequest = CType(WebRequest.Create(ParentFolderpath), FtpWebRequest)
        ftpRequest.Credentials = New NetworkCredential(UserId, Password)
        ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory
        Dim response As FtpWebResponse = CType(ftpRequest.GetResponse(), FtpWebResponse)
        Dim streamReader As StreamReader = New StreamReader(response.GetResponseStream())
        Dim directories As List(Of String) = New List(Of String)()
        Dim line As String = streamReader.ReadLine()

        While Not String.IsNullOrEmpty(line)
            directories.Add(line)
            line = streamReader.ReadLine()
        End While
        streamReader.Close()
        Return directories

    Catch ex As Exception
        Return Nothing
    End Try

 End Function

如前所述,它只返回给定文件夹的列表。

接下来,添加到树视图的例程。

Sub PopulateTreeViewFiles(fRoot As String, dtParent As List(Of String), parentId As String, treeNode As TreeNode)

    For Each sFile As String In dtParent
        Dim sFileOnly As String = Replace(sFile, parentId, "")
        Dim child As New TreeNode() With {
         .Text = Replace(sFileOnly, "/", ""),
         .Value = fRoot + sFileOnly
        }
        If InStr(sFileOnly, ".") <> 0 Then
            child.ShowCheckBox() = True         ' is a file - no expand
        Else
            child.PopulateOnDemand = True       ' is folder - allow expand
        End If
        If parentId = "" Then
            TreeView1.Nodes.Add(child)          ' empty tree - add to base tree
        Else
            treeNode.ChildNodes.Add(child)      ' user clicking on a node
        End If
    Next

End Sub

就是这样!!

生成的屏幕如下所示:

在此处输入图片说明

所以现在你有一个基于 FTP 的树视图。

请注意,每个文件都有一个复选框,因此您可以根据需要选择任意数量的文件,然后使用树视图的选定集合。

所以,代码不多,但树视图是“动态的”。 请注意,我们可以在开始时填充整个树视图(只需将按需代码例程移至主例程),但如前所述,这会大大减慢速度。 这样,我们只拉 + 填充起始文件夹,所以它应该工作得非常快。

我在 c# 中没有这个,但是上面已经足够简单了您可以通过 vb 到 c# 转换器发送上述例程,但是代码并不复杂,并且非常“基本”。 并且 FTP 代码也许可以替换为您自己的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM