2012-10-04 68 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

这将做到这一点!谢谢! :)虽然我不得不对代码做一些更改,但我不想像这样在动态创建控件。但这只是一个小任务:) –