none
Treeview com apenas 1 checkbox RRS feed

  • Pergunta

  •  

    Ola!!

    Estou a utilizar a framework 3.5 e pela primeira vez o objecto TreeView de windows forms.

    Necessito de utilizar checkboxes nos nós mas apenas em alguns.

    Por exemplo nos nós do primeiro nivel da arvore não são mostrados checkboxes mas nos filhos desses nós são apresentados checkbox.

    Isto é possível??

    Agradeço desde já o tempo dispendido na leitura desta mensagem e em qualquer ajuda possivel.

    Obrigado.

    sexta-feira, 11 de janeiro de 2008 17:09

Respostas

  • Uma maneira é usar o P/Invoke para enviar uma mensagem TVM_SETITEM ao item em que não quer checkboxes. O código ficaria mais ou menos assim:

            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;

            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;

            }

            [DllImport("user32.dll")]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
              IntPtr lParam);

    No evento Load da Form, você colocaria:

            foreach (TreeNode n in treeView1.Nodes)
                if (n.Parent == null)
                {
                    TVITEM tvi = new TVITEM();
                    tvi.hItem = n.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(this.treeView1.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
                }



    Bruno
    domingo, 13 de janeiro de 2008 09:05

Todas as Respostas

  • Uma maneira é usar o P/Invoke para enviar uma mensagem TVM_SETITEM ao item em que não quer checkboxes. O código ficaria mais ou menos assim:

            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;

            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;

            }

            [DllImport("user32.dll")]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
              IntPtr lParam);

    No evento Load da Form, você colocaria:

            foreach (TreeNode n in treeView1.Nodes)
                if (n.Parent == null)
                {
                    TVITEM tvi = new TVITEM();
                    tvi.hItem = n.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(this.treeView1.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
                }



    Bruno
    domingo, 13 de janeiro de 2008 09:05
  •  Bruno Sonnino wrote:
    Uma maneira é usar o P/Invoke para enviar uma mensagem TVM_SETITEM ao item em que não quer checkboxes. O código ficaria mais ou menos assim:

            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;

            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;

            }

            [DllImport("user32.dll")]
            static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
              IntPtr lParam);

    No evento Load da Form, você colocaria:

            foreach (TreeNode n in treeView1.Nodes)
                if (n.Parent == null)
                {
                    TVITEM tvi = new TVITEM();
                    tvi.hItem = n.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(this.treeView1.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
                }



    Bruno

     

    Obrigado. Esta resposta está completamente correcta.

    segunda-feira, 14 de janeiro de 2008 10:25