2011-09-05 29 views
5

Estoy usando una vista de árbol con tres niveles de nodos, el segundo nivel que he configurado no tiene casillas de verificación con el código en this question.TreeNode.Handle no regresa usando Treeview

Funciona muy bien, excepto la primera casilla de verificación que nunca se encuentra con la casilla de verificación tiene eliminado:

Example of error

Voy a llamar al método HideCheckBox() con este código que es después de que todos los datos han ha cargado en la vista de árbol:

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

cuando paso a través del código parece que node.Handle devuelve 0 para el primer nodo que encuentra y esto no es un identificador válido para utilizar cuando se llama al código para eliminar la comprobar caja. Por extraño que parezca, si llamo al método para eliminar la casilla de verificación dos veces, el identificador se devuelve correctamente.

¿Alguien puede sugerir por qué TreeNode.Handle no devolverá el valor correcto?

EDIT:

Aquí está el código conforme a lo solicitado -

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

¿Puedes mostrar tu código donde quites la casilla de verificación y llamar al nodo. Manio? –

+0

¿Es visible TreeView cuando llama a HideCheckBox()? Me refiero a TreeView.Visible se establece en true? –

Respuesta

9

La verdadera razón no es visible en el código. Esto fallará como se describe cuando se llama a este código desde el constructor del formulario. Demasiado pronto, solo puede funcionar cuando se crea la ventana nativa TreeView. No es hasta entonces que TreeNode.Handle obtiene un valor. El uso de tvw.Handle activará la creación del identificador nativo de la ventana, demasiado tarde para dar el nodo. Mande un valor para el primer nodo.

Mueva el código a un controlador de eventos Load o anulación OnLoad.