2010-07-04 13 views
15

Poniższy kod pochodzi bezpośrednio z firmy Microsoft pod numerem http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.aftercheck%28VS.80%29.aspx.Widok drzewa WinForm, rekurencyjnie sprawdź problem węzłów podrzędnych

// Updates all child tree nodes recursively. 
    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 
    { 
    foreach (TreeNode node in treeNode.Nodes) 
    { 
    node.Checked = nodeChecked; 
    if (node.Nodes.Count > 0) 
    { 
    // If the current node has child nodes, call the CheckAllChildsNodes method recursively. 
    this.CheckAllChildNodes(node, nodeChecked); 
    } 
    } 
    } 

    // NOTE This code can be added to the BeforeCheck event handler instead of the AfterCheck event. 
    // After a tree node's Checked property is changed, all its child nodes are updated to the same value. 
    private void node_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
    // The code only executes if the user caused the checked state to change. 
    if (e.Action != TreeViewAction.Unknown) 
    { 
    if (e.Node.Nodes.Count > 0) 
    { 
    /* Calls the CheckAllChildNodes method, passing in the current 
    Checked value of the TreeNode whose checked state changed. */ 
    this.CheckAllChildNodes(e.Node, e.Node.Checked); 
    } 
    } 
    } 

umieścić go w formie zawierającej katalogów i nazywają node_AfterCheck na (niespodzianka) terminem katalogów AfterCheck. Następnie rekursywnie sprawdza lub odznacza węzły podrzędne w widoku drzewa.

Jeśli jednak faktycznie to wypróbujesz i klikniesz kilka razy w tym samym oknie wyboru drzewa wystarczająco szybko, węzły podrzędne będą kończyły z niezsynchronizowaną kontrolą z rodzica. Prawdopodobnie potrzebujesz kilku poziomów dzieci z maksymalnie 100 dziećmi, aby aktualizacja interfejsu użytkownika była wystarczająco powolna, aby zauważyć, że tak się dzieje.

Próbowałem kilka rzeczy (na przykład wyłączenie kontroli widoku drzewa na początku node_AfterCheck i ponowne włączenie na końcu), ale problem z niesynchronizowaniem nadal występuje.

Wszelkie pomysły?

+0

ja pisał mój obejście w temacie dzieci z tego: http://stackoverflow.com/questions/14699102/treeview-check-uncheck-all-child-items/23065225#23065225 –

Odpowiedz

30

Klasa .NET TreeView w dużym stopniu dostosowuje obsługę myszy do natywnej kontroli systemu Windows w celu zsyntetyzowania zdarzeń Przed/Po. Niestety nie udało im się to dobrze. Gdy zaczniesz szybko klikać, będziesz generować wiadomości z podwójnym kliknięciem. Natywna kontrola reaguje na dwukrotne kliknięcie, przełączając sprawdzany stan dla elementu, bez powiadamiania o tym otoku .NET:. Nie otrzymasz zdarzenia Before/AfterCheck.

To błąd, ale go nie naprawią. Obejście problemu nie jest trudne, musisz uniemożliwić natywnej kontroli wyświetlanie zdarzenia dwukrotnego kliknięcia. Dodaj nową klasę do swojego projektu i wklej poniższy kod. Skompilować. Upuść nowy element sterujący z górnej części przybornika, zastępując istniejący.

using System; 
using System.Windows.Forms; 

class MyTreeView : TreeView { 
    protected override void WndProc(ref Message m) { 
     // Filter WM_LBUTTONDBLCLK 
     if (m.Msg != 0x203) base.WndProc(ref m); 
    } 
} 
+1

Dlaczego nie naprawią tego? – Kamil

+0

@Kamil, ponieważ 'winforms' ma umrzeć. Wszystkie one prędzej czy później przejdą na 'WPF'. –

+3

Tak, zbliżająca się śmierć została przewidziana na 7 lat. –

Powiązane problemy