utilizar llenar example ejemplos dinamico dinamicamente como winforms treeview treenode

llenar - ¿Cómo deshabilitar una casilla de verificación del nodo WinForms TreeView?



treeview c# ejemplos (3)

No hay nada incorporado para hacer esto. Puede usar el evento BeforeCheck y cancelarlo para los nodos deseados. En caso de que la apariencia de la casilla de verificación sea importante, entonces deberá colocar una imagen allí para mostrar la casilla de verificación desactivada.

Este link puede ser de su interés.

Necesito poder deshabilitar algunas de las casillas de verificación en un control TreeView de una aplicación WinForms, pero no hay tal funcionalidad incorporada al control TreeView estándar.

Ya estoy usando el evento TreeView.BeforeCheck y lo cancelo si el nodo está deshabilitado y eso funciona perfectamente bien.

También cambio el ForeColor de los nodos deshabilitados a GrayText.

¿Alguien tiene una solución simple y robusta?


TreeView.BeforeCheck: regístrese para este evento, verifique si el nodo es uno donde las casillas de verificación se pueden marcar o no y, si no se puede marcar, puede cancelar el evento configurando la propiedad Cancelar en TreeViewCancelEventArgs. Esperemos que esto impida que el usuario marque esas casillas, pero que no sea la mejor experiencia para el usuario.

Para eliminar las casillas de verificación de los elementos no verificables, posiblemente podría usar el dibujo del propietario para dibujar un rectángulo sólido sobre la casilla de verificación para eliminarla.


Ya que hay soporte en C ++, podemos resolverlo usando p / invoke.

Aquí está la configuración de la parte p / invoke, solo hazla disponible para la clase que llama.

// constants used to hide a checkbox public const int TVIF_STATE = 0x8; public const int TVIS_STATEIMAGEMASK = 0xF000; public const int TV_FIRST = 0x1100; public const int TVM_SETITEM = TV_FIRST + 63; [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); // struct used to set node properties public 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; }

Queremos determinar en un nodo por nodo. La forma más fácil de hacerlo es en el evento de nodo de dibujo. Tenemos que configurar nuestro árbol para que se establezca como propietario dibujado en orden para este evento, así que asegúrese de establecerlo en una configuración diferente a la predeterminada.

this.tree.DrawMode = TreeViewDrawMode.OwnerDrawText; this.tree.DrawNode += new DrawTreeNodeEventHandler(tree_DrawNode);

En su función tree_DrawNode, determine si el nodo que se está dibujando debe tener una casilla de verificación, y ocúltelo cuando corresponda. A continuación, establezca la propiedad Dibujo predeterminado en verdadero, ya que no queremos preocuparnos por dibujar todos los demás detalles.

void tree_DrawNode(object sender, DrawTreeNodeEventArgs e) { if (e.Node.Level == 1) { HideCheckBox(e.Node); e.DrawDefault = true; } else { e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font, Brushes.Black, e.Node.Bounds.X, e.Node.Bounds.Y); } }

Por último, la llamada real a la función que definimos:

private void HideCheckBox(TreeNode node) { TVITEM tvi = new TVITEM(); tvi.hItem = node.Handle; tvi.mask = TVIF_STATE; tvi.stateMask = TVIS_STATEIMAGEMASK; tvi.state = 0; IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi)); Marshal.StructureToPtr(tvi, lparam, false); SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam); }