2010-04-04 118 views
2

我在包含遞歸嵌套子文件夾的服務器上有一個公用文件夾。 在包含圖像的各種Leaf文件夾中。 我想創建一個服務器端文件瀏覽器,將圖像顯示給用戶。 我正在使用ASP.NET TreeView控件。 我使用PopulateOnDemand創建樹節點。 如果用戶點擊葉子目錄,我希望該文件夾中的圖像顯示在DataList控件中。TreeView控件問題

問題是,當我的子樹節點上單擊(後我擴大它的父節點) 所有擴展子樹消失只有父節點表明沒有+符號旁邊!

(我已經設置TreeView的PopulateNodesFromClient屬性爲true)

有人能告訴我是什麼問題?

感謝

下面是代碼:

<asp:TreeView ID="TreeView1" runat="server" AutoGenerateDataBindings="False" 
        onselectednodechanged="TreeView1_SelectedNodeChanged" 
        ontreenodepopulate="TreeView1_TreeNodePopulate"> 
       </asp:TreeView> 




protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     string path = Server.MapPath("."); 
     PopulateTopNodes(path); 
    } 
} 

private void PopulateTopNodes(string pathToRootFolder) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(pathToRootFolder); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name,dir.FullName); 

     if (dir.GetDirectories().Length > 0) 
     { 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     TreeView1.Nodes.Add(folderNode); 
    } 
} 


protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
{ 

    if (IsCallback == true) 
    { 
     if (e.Node.ChildNodes.Count == 0) 
     { 
      LoadChildNode(e.Node); 
     } 
    } 


} 

private void LoadChildNode(TreeNode treeNode) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(treeNode.Value); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name, dir.FullName); 
     if(dir.GetDirectories().Length>0){ 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     treeNode.ChildNodes.Add(folderNode); 
    } 
} 







protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    // Retrieve the images here 
} 

回答

1

我沒有給你一個直接的答案,但你正在做的事情錯了,因爲你只裝載在Page_Load中的節點,甚至只在第一次加載。這意味着您依賴ViewState將所有節點之間的回傳保存好,但這不是正確的方式。

雖然在我看來,你很親密。我將刪除Page_Load,然後查看此頁面的最後一個示例:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview(VS.80).aspx

+0

親愛的Jan, 謝謝您的回答。 當TreeView.PopulateNodesFromClient屬性爲 爲true(默認值)時,TreeView執行客戶端回調以檢索它需要的節點 給定節點只根據需要填充一次。之後,這些值在客戶端保持可用,如果同一個節點被摺疊並展開,則不執行回調。 這就是控制應該表現的方式。 (也許使用SelectedNodeChanged事件與PopulateNodesFromClient等一起造成該錯誤?) 我會看看你推薦的例子。 謝謝 – ProgNet 2010-04-04 15:13:31

+0

我從我的例子 [Here](http://www.aspnettutorials.com/tutorials/controls/treeview-open-files-cs.aspx) – ProgNet 2010-04-04 15:24:06

+0

對我來說,似乎你的差異代碼,並且示例是,他們在Page_Load中執行的所有操作都設置了根節點 - 其他所有內容都由客戶端調用填充。您正在加載Page_Load中的所有節點。 – 2010-04-04 15:35:35

0

我有同樣的確切問題,並設置屬性PopulateNodesFromClient =「false」解決了它。

編輯:TreeView控件的屬性。