簡體   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