2012-10-04 109 views
0

我想創建一個簡單的打印機管理器來在我們的終端服務器環境中使用。由於GPO限制,我可以使用的內置功能有限制。所以我決定嘗試寫我自己的簡單GUI來做到這一點。VB.NET +將文件夾添加到樹視圖和文件到列表視圖

現在,打印機分佈在一個文件夾中,用子文件夾對它們進行分類。在每個文件夾中,打印服務器上的實際打印機都有.lnk文件。

我想要做的是使用文件夾和列表視圖中的打印機填充樹視圖,基於哪個項目在樹視圖上單擊。

我已經設法搜索目錄並搜索我點擊過的每個項目的文件。但是我意識到,爲什麼不在表單啓動期間使用集合或類似工具來執行此操作?這樣,它會更快。因爲現在,每次點擊樹狀視圖中的項目都會有一些延遲。因爲它每次都掃描文件。

我該如何添加相同的集合並使用它呢?

這裏是我當前的代碼:

Public Sub populateTreeView(ByVal strPath As String) 

     Dim di As New IO.DirectoryInfo(strPath) 
     Dim diar1 As IO.DirectoryInfo() = di.GetDirectories() 
     Dim dra As IO.DirectoryInfo 

     For Each dra In diar1 
      ImageList1.Images.Add(GetSmallIcon(dra.FullName)) 

      TreeView1.Nodes.Add("", dra.Name, nIndex) 
      nIndex = nIndex + 1 
     Next 
    End Sub 

    Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect 
     ListView1.Clear() 
     nIndex = 0 

     Dim di As New IO.DirectoryInfo(strIniSettings & "\" & TreeView1.SelectedNode.Text) 
     Dim diar1 As IO.FileInfo() = di.GetFiles() 
     Dim dra As IO.FileInfo 

     For Each dra In diar1 
      Dim strName As String 
      strName = Replace(dra.Name, ".lnk", "") 
      ImageList2.Images.Add(GetLargeIcon(dra.FullName)) 

      ListView1.Items.Add("", strName, nIndex) 
      nIndex = nIndex + 1 
     Next 
    End Sub 

通知的圖像列表?我也爲每個項目獲取圖標。

回答

1

由於您的數據並不複雜,因此一個簡單的LookUp可能是適合您的集合(或簡單的字典)。

只需查詢打印機一次,並將其存儲在成員變量中,或者僅使用TreeNodeTag屬性,以便存儲文件名。

在下面的例子中,我使用一個簡單的Linq查詢創建LookUp,其中Key爲目錄名(你也可以只使用完整路徑的目錄),以及項目的文件名。

然後,您可以通過給定的Key(目錄名稱)查詢集合,或使用Tag屬性。


LINQPad例如:

Sub Main 

    ' query printers once (just replace C:\test with your path) 
    ' store the result in a member variable of your form 
    Dim printer = new DirectoryInfo("C:\test").GetDirectories() _ 
               .SelectMany(Function(d) d.GetFiles()) _ 
               .ToLookup(Function(f) f.Directory.Name, Function(f) f.Name) 

    ' Or, using a Dictionary 
    ' Dim printer = new DirectoryInfo("C:\test").GetDirectories() _ 
    '           .ToDictionary(Function(d) d.Name, Function(d) d.GetFiles().Select(Function(f) f.Name).ToList()) 



    Dim l = new ListView() With {.Dock = DockStyle.Right} 
    Dim t = new TreeView() With {.Dock = DockStyle.Left}      
    AddHandler t.AfterSelect, Sub(s, e) 
            ' This is your AfterSelect event handler 
            ' The filenames are stored in the Tag of the TreeNode 
            ' You could also use 'For Each p As String in printer(e.Node.Text)' 
            l.Items.Clear() 
            For Each p As String in e.Node.Tag 
             Dim item = l.Items.Add(p.Replace(".lnk", "")) 
             'TODO: Set Icon on item 
            Next 
           End Sub 

    ' Populate TreeView once 
    For Each folder in printer 
     Dim fNode = t.Nodes.Add(folder.Key) 
     'TODO: Set Icon on fNode 

     ' store the files in the Tag of the node. 
     ' You don't have to, but it will make it easier 
     fNode.Tag = folder 
    Next 

    ' Show test form    
    Dim w = new Form() 
    w.Controls.Add(t) 
    w.Controls.Add(l) 
    w.Show() 

End Sub 
+0

這將做到這一點!謝謝! :)雖然我不得不對代碼做一些更改,但我不想像這樣在動態創建控件。但這只是一個小任務:) –