[Visual C#] Jak uniknąć dublowania node'ów w treeView?

0

Witam.

Visual C# Express Edition 2008.

Stworzyłem sobie treeView z drzewem napędów i folderów. Działa to mniej więcej tak, że najpierw odczytuję z biblioteki shell32.dll listę ikon 16x16 i wypełniam nimi imageList, łączę tą listę z treeView, , tworzę gotowe nody dla napędów hdd, CD i fdd. Następnie odczytuję listę napędów (GetLogicalDrives), sprawdzam rodzaj każdego i wypełniam nimi treeview. Odczytuję zdarzenie treeView1_AfterSelect, a w nim odczytuję listę folderów dla danego napędu (GetDirectories), następnie (wszystko to robię w zdarzeniu AfterSelect) w pętli "wyciągam" z każdej pozycji samą nazwę folderu (Path.GetFileName), podstawiam tak wyciągniętą nazwę do TreeNode, i tak przygotowany node dodaję do listy nodów w treeView. Na koniec rozwijam zaznaczonego Noda (SelectedNode.Expand). Niby wszystko pięknie działa, ale... właśnie. Jest jedno ale.. Otóż dzieje się coś takiego, że.. Klikam na napędzie... Rozwija się gałąź z folderami. Jest OK. Następnie klikam gdzie indziej, i jak ponownie kliknę na tym napędzie, to on mi ponownie dodaje te same foldery. Każde kolejne zdeaktywowanie noda i jego ponowne kliknięcie powoduje ponowne dodanie folderów, które już są na liście. Gdzie robię błąd?
Próbowałem użyć metod Contains i Find do sprawdzenia, czy dany Node już istnieje, ale bez względu, co bym nie podstawiał za ich parametry, to mi po prostu nie działa.

I jeszcze jedno. Dopóki nie kliknę na jakimś folderze i nie rozwinę jego podfolderów, nie mam przy nim plusa. Jaki jest najprostszy i najszybszy (w sensie działania, a nie programowania) sposób na dodanie plusów folderom, które mają podfoldery?

P.S. A może istnieje gotowy darmowy komponent, który można doinstalować do VC#EE, i który wystarczy wciągnąć na formatkę? Piszę sobie ciut większy program, a rozkładam się na takich drobiazgach :( Istnieje taki pakiet SHell Mega Pack.NET. Tam jest kilka takich komponentów, ale niestety jest płatny.

0

Niestety (i na szczęście) praktycznie wszystkie lepsze komponenty do .NET są płatne.

Możesz po prostu zastosować Clear dla każdego Node, gdy go zaczynasz wypełniać.

A plusy dla katalogu możesz uzyskać wstawiając jakiś pusty element - i tak go usuniesz otwierając Node (dodaj go tylko dla niepustych katalogów).

Aha - i ikonki dla każdego pliku lepiej będzie uzyskać nie przez wyciągnięcie ikon z shell32.dll tylko istnieje jakaś funkcja w systemie, która zwróci taką ikonkę dla pliku. Wtedy będziesz miał identyczne ikonki dla plików jakie pojawiają się w Exploerze, a nie te domyślne.

0

Może o takie coś chodzi?

void DirectoryTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
    //wyczyszczenie listy podkatalogów
    e.Node.Nodes.Clear();
    //wypełnienie podkatalogów dla danego katalogu dwa poziomy w dół
    this.FillSubDirectories(e.Node);
    for (int i = 0; i < e.Node.Nodes.Count; i++)
        this.FillSubDirectories(e.Node.Nodes[i]);
}

private void FillSubDirectories(TreeNode node)
{
    try
    {
        foreach (DirectoryInfo di in new DirectoryInfo(node.FullPath).GetDirectories())
            node.Nodes.Add(di.Name);
    }
    catch
    {
    }
}
0

DOKŁADNIE o to chodziło :) Dzięki wielkie.

Rev.pl - funkcja do wyciągania ikon (i innych informacji o pliku) to jest SHGetFileInfo. Ale do budowania drzewa napędów i folderów raczej nie jest ona potrzebna. Dopiero przy wyświetlaniu plików. Ale to juz kolejny krok, który mam do wykonania :) Pliki będą wyświetlane w listView.

1 użytkowników online, w tym zalogowanych: 0, gości: 1