0

ターミナル サーバー環境で使用する単純なプリンター マネージャーを作成したいと考えています。GPO の制限により、使用できる組み込み機能に制限があります。そこで、それを行うための独自の単純な GUI を作成することにしました。

現在、プリンターはフォルダーに分散されており、それらを分類するためのサブフォルダーがあります。各フォルダーには、プリントサーバー上の実際のプリンターへの .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

イメージリストに注目してください。各アイテムのアイコンも取得します。

4

1 に答える 1

1

あなたのデータは複雑ではないので、単純なLookUpものが適切なコレクションかもしれません (または単純な辞書)。

プリンタを 1 回クエリしてメンバ変数に格納するかTag、s のプロパティを使用しTreeNodeてファイル名を格納するだけです。

以下の例では、単純な Linq クエリを使用してLookUpKeyがディレクトリ名 (ディレクトリへのフル パスを使用することもできます) を作成し、項目がファイル名です。

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
于 2012-10-04T08:39:26.333 に答える