2011-09-05 2 views
5

Sto utilizzando una vista ad albero con tre livelli di nodi, il secondo livello che ho impostato per non avere caselle di controllo utilizzando il codice in this question.TreeNode.Handle non restituisce utilizzando Treeview

Funziona molto bene, tranne la prima casella di controllo che incontra mai ha rimosso la casella di controllo:

Example of error

sto chiamando il metodo HideCheckBox() con questo codice che è dopo tutti i dati ha caricato nella treeview:

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

quando passo attraverso il codice sembra che node.Handle restituisce 0 per il primo nodo che incontra e questo non è un handle valido da utilizzare quando si chiama il codice per rimuovere la dai un'occhiata scatola. Stranamente, se chiamo il metodo per rimuovere due volte la casella di controllo, l'handle viene restituito correttamente.

Qualcuno può suggerire perché TreeNode.Handle non restituirà il valore corretto?

EDIT:

Ecco il codice come richiesto -

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

puoi mostrare il tuo codice in cui rimuovi la casella di controllo e chiama il nodo.Handle? –

+0

È visibile TreeView quando si chiama HideCheckBox()? Voglio dire TreeView.Visible è impostato su true? –

risposta

9

La vera ragione non è visibile nel codice. Questo fallirà come descritto quando chiami questo codice dal costruttore del form. Troppo presto, può funzionare solo quando viene creata la finestra TreeView nativa. Non fino ad allora TreeNode.Handle ottiene un valore. Utilizzando tvw.Handle si attiverà la creazione dell'handle nativo della finestra, troppo tardi per dare a node.Handle un valore per il primo nodo.

Spostare il codice su Load event handler o OnLoad override.