2011-09-05 15 views
5

Używam widoku drzewa z trzema poziomami węzłów, drugiego poziomu, który ustawiłem, aby nie mieć pól wyboru przy użyciu kodu w this question.TreeNode.Handle nie powraca przy użyciu Treeview

To działa bardzo dobrze z wyjątkiem pierwszego wyboru nigdy nie napotka ma wyboru usunięte:

Example of error

Dzwonię metodę HideCheckBox() z tym kodem, który jest po wszystkich danych ma zostały załadowane do katalogów:

foreach (TreeNode appNode in trvPermissions.Nodes) 
{ 
     foreach (TreeNode secNode in appNode.Nodes) 
     { 
     HideCheckBox(trvPermissions, secNode); 
     } 
} 

kiedy krok poprzez kod wydaje się, że node.Handle zwraca 0 dla pierwszego węzła napotka i nie jest to ważne, aby korzystać z uchwytu podczas wywoływania kodu w celu usunięcia czek pudełko. Co dziwne, jeśli zadzwonię do metody, aby usunąć zaznaczenie dwa razy, uchwyt zostanie zwrócony prawidłowo.

Czy ktoś może zasugerować, dlaczego TreeNode.Handle nie zwróci poprawnej wartości?

EDIT:

Oto kod na żądanie -

private const int TVIF_STATE = 0x8; 
    private const int TVIS_STATEIMAGEMASK = 0xF000; 
    private const int TV_FIRST = 0x1100; 
    private const int TVM_SETITEM = TV_FIRST + 63; 

    [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] 
    private struct TVITEM 
    { 
     public int mask; 
     public IntPtr hItem; 
     public int state; 
     public int stateMask; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string lpszText; 
     public int cchTextMax; 
     public int iImage; 
     public int iSelectedImage; 
     public int cChildren; 
     public IntPtr lParam; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, 
              ref TVITEM lParam); 

    /// <summary> 
    /// Hides the checkbox for the specified node on a TreeView control. 
    /// </summary> 
    private void HideCheckBox(TreeView tvw, TreeNode node) 
    { 
     TVITEM tvi = new TVITEM(); 
     tvi.hItem = node.Handle; 
     tvi.mask = TVIF_STATE; 
     tvi.stateMask = TVIS_STATEIMAGEMASK; 
     tvi.state = 0; 
     SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); 
    } 
+1

możesz pokazać swój kod tam, gdzie to pole wyboru jest usuwane i dzwonić do węzła.Handle? –

+0

Czy TreeView jest widoczny po wywołaniu HideCheckBox()? Mam na myśli, że TreeView.Visible jest ustawione na true? –

Odpowiedz

9

Prawdziwym powodem nie jest widoczny w kodzie. To się nie powiedzie, jak opisano, gdy wywołasz ten kod z konstruktora formularzy. Zbyt wcześnie, może działać tylko wtedy, gdy tworzone jest rodzime okno TreeView. Dopiero wtedy otrzymam wartość TreeNode.Handle. Użycie polecenia tvw.Handle spowoduje uruchomienie natywnego uchwytu okna, zbyt późno, aby przekazać węzeł. Podaj wartość dla pierwszego węzła.

Przenieś kod do modułu obsługi zdarzeń Load lub zastąpienia OnLoad.