Estoy atascado en .NET 2.0 de Windows Forms.

No se ve como la posibilidad de seleccionar varios nodos existe en la norma TreeView de control.

Estoy tratando de hacerlo en un contexto de selección de menú. Así que casillas no son aceptables paradigma de interfaz de usuario aquí.

¿Cuál es la mejor manera de prever que muy funcionalidad necesaria?

6 Comentarios

  1. 10

    Esto lo hicimos en un WTI proyecto una vez, pero el trabajo básico necesario es el mismo para .NET. Para lograr una selección múltiple control de árbol, es necesario dibujar los elementos del árbol de sí mismo y reemplazar el teclado y el manejo del ratón. Usted también tendrá que mantener su propia lista de elementos que están seleccionados.

    No olvide considerar las normas de selección (son los padres y los niños, por ejemplo), y no te olvides de aplicar los métodos abreviados de teclado, incluyendo la selección mediante las teclas Ctrl, Mayús y Ctrl+Shift, así como la barra Espaciadora para seleccionar/deseleccionar.

    • Usted puede obtener haciendo el dibujo de sí mismo mediante la interceptación de WM_NOTIFY y ajustar el color de fondo para los nodos seleccionados. He añadido una respuesta para que yo pueda incluir el código.
    • Esa es sin duda la forma más sencilla si todo lo que usted necesita es un cambio de color.
  2. 7

    TreeView.Casillas de verificación

    • Eso no es realmente lo que estoy buscando. Todos los demás árboles de la vista de Windows permite ctrl-clic para seleccionar múltiples entradas. Y la conducción de un menú de contexto de checky casillas no tiene ningún sentido.
    • No puedo encontrar un ejemplo de una combinación de teclas ctrl-clic en la vista de árbol en cualquier lugar en el «estándar» de Windows entorno de sistema operativo. ¿Puede dar un ejemplo? Estoy de acuerdo en que un menú de contexto de los cheques que no es muy sensato, pero no creo que esperando a los usuarios ctrl+clic es. (Muchos de los usuarios tienen problemas con los que, en mi exp.)
    • Para el estándar de Formularios de Windows vista en árbol, que es la manera de seleccionar más de un nodo en el árbol.
    • Bueno, «estándar» puede ser la palabra equivocada. Tomemos, por ejemplo, el Explorador de soluciones de Visual Studio.
    • El problema es que el «estándar» de controles para jugar y utilizar de forma gratuita (los que se suministran con VS) no son necesariamente los que se ven realmente se utiliza en Windows. Usted tiene tres opciones 1) casillas de verificación 2) escribe tu propia 3) comprar uno. Una mierda, lo sé. Su fácil de hacer en WPF!
  3. 5

    Son cuadros de verificación de una opción? o quieres la selección en un cuadro de lista?

    • casillas de verificación están construidas en
    • seleccione como en un cuadro de lista requiere un control de árbol de encargo

    Hay una selección múltiple de control de árbol disponible en CodeProject:Multi-Seleccione Vista De Árbol

  4. 4

    Que usted puede buscar en una 3ª parte de la solución. El Infragistics árbol hace esto. No es gratis, pero el tiempo que pasé tratando de encontrar una solución no es realmente libre, ya sea.

    • -1 : me llevó mucho menos de 5 minutos para encontrar una simple libre de uno y aplicarlo en mi solución. Aquí hay 2 muestras: codeproject.com/KB/tree/MWTreeViewv2010.aspx, arstdesign.com/articles/treeviewms.html. No es perfecto, pero funciona y que podría ser mejorada si usted sabe su manera alrededor de ella.
    • Los artículos son de 2004 y 2002, respectivamente, estoy seguro de que hay mejores maneras de implementar la misma cosa hoy.
    • A pesar de que es viejo (2004), la primera aplicación es confiable, y bien codificado. Cabe en una clase que hereda de TreeView y es muy fácil de adaptar.
  5. 3

    El código de abajo, le permitirá ajustar el color de fondo que usted use, para asegurarse de que todos los nodos seleccionados se resaltan.

    protected override void WndProc(ref Message m)
    {
    switch (m.Msg) {
    //WM_REFLECT is added because WM_NOTIFY is normally sent just
    //to the parent window, but Windows.Form will reflect it back
    //to us, MFC-style.
    case Win32.WM_REFLECT + Win32.WM_NOTIFY: {
    Win32.NMHDR nmhdr = (Win32.NMHDR)m.GetLParam(typeof(Win32.NMHDR));
    switch((int)nmhdr.code) {
    case Win32.NM_CUSTOMDRAW:
    base.WndProc(ref m);
    Win32.NMTVCUSTOMDRAW nmTvDraw = (Win32.NMTVCUSTOMDRAW)m.GetLParam(typeof(Win32.NMTVCUSTOMDRAW));
    switch (nmTvDraw.nmcd.dwDrawStage) {
    case Win32.CDDS_ITEMPREPAINT:
    //Find the node being painted.
    TreeNode n = TreeNode.FromHandle(this, nmTvDraw.nmcd.lItemlParam);
    if (allSelected.Contains(n))
    //Override its background colour.
    nmTvDraw.clrTextBk = ColorTranslator.ToWin32(SystemColors.Highlight);
    m.Result = (IntPtr)Win32.CDRF_DODEFAULT;  //Continue rest of painting as normal
    break;
    }
    Marshal.StructureToPtr(nmTvDraw, m.LParam, false);  //copy changes back
    return;
    }
    break;
    }
    }
    base.WndProc(ref m);
    }
    //WM_NOTIFY notification message header.
    [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
    public class NMHDR
    {
    private IntPtr hwndFrom;
    public IntPtr idFrom;
    public uint code;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct NMCUSTOMDRAW
    {
    public NMHDR hdr;
    public int dwDrawStage;
    public IntPtr hdc;
    public RECT rc;
    public IntPtr dwItemSpec;
    public int uItemState;
    public IntPtr lItemlParam;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct NMTVCUSTOMDRAW
    {
    public NMCUSTOMDRAW nmcd;
    public int clrText;
    public int clrTextBk;
    public int iLevel;
    }
    public const int CDIS_SELECTED = 0x0001;
    public const int CDIS_FOCUS = 0x0010;
    public const int CDDS_PREPAINT = 0x00000001;
    public const int CDDS_POSTPAINT = 0x00000002;
    public const int CDDS_PREERASE = 0x00000003;
    public const int CDDS_POSTERASE = 0x00000004;
    public const int CDDS_ITEM = 0x00010000;  //item specific 
    public const int CDDS_ITEMPREPAINT = (CDDS_ITEM | CDDS_PREPAINT);
    public const int CDDS_ITEMPOSTPAINT = (CDDS_ITEM | CDDS_POSTPAINT);
    public const int CDDS_ITEMPREERASE = (CDDS_ITEM | CDDS_PREERASE);
    public const int CDDS_ITEMPOSTERASE = (CDDS_ITEM | CDDS_POSTERASE);
    public const int CDDS_SUBITEM = 0x00020000;
    public const int CDRF_DODEFAULT = 0x00000000;
    public const int CDRF_NOTIFYITEMDRAW = 0x00000020;
    public const int CDRF_NOTIFYSUBITEMDRAW = 0x00000020;  //flags are the same, we can distinguish by context
    public const int WM_USER = 0x0400;
    public const int WM_NOTIFY = 0x4E;
    public const int WM_REFLECT = WM_USER + 0x1C00;

Dejar respuesta

Please enter your comment!
Please enter your name here