c# - 禁用一个 TreeView 节点中的复选框

标签 c# .net winforms

我在禁用 TreeView 节点中的复选框时遇到问题。

我想在节点有子节点时禁用复选框。

这是我的 TreeView :

enter image description here

及其代码:

        for (int i = 0; i < dataTableMateriały.Rows.Count; i++)
        {
            treeNode = tree.Nodes.Add(dataTableMateriały.Rows[i][0].ToString());
            if (treeNode.Text.Contains("A3"))
            {
                for (int j = 0; j < dataTablePoddruki.Rows.Count; j++)
                {
                    treeNode.Nodes.Add(dataTablePoddruki.Rows[i][0].ToString());
                }
            }
        }

我想禁用“formularzA3”上的复选框 - 仅限于此。子项的复选框应该在这里。

有人可以帮我完成这个任务吗?

最佳答案

这应该可以完成工作。如果节点有子节点,它将删除复选框

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);


    private void RemoveCheckBoxes(TreeView tree)
    {
        List<TreeNode> nodes = new List<TreeNode>();
        foreach (TreeNode n in tree.Nodes)
        {
            if(n.Nodes.Count > 0)
            {
                 nodes.AddRange(GetNodes(n));
            }
        }

        foreach (TreeNode n in nodes)
        {
            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);
        }
    }

    private List<TreeNode> GetNodes(TreeNode node)
    {
        List<TreeNode> nodes = new List<TreeNode>();
        if(node.Nodes.Count > 0)
            nodes.Add(node);
        foreach (TreeNode n in node.Nodes)
        {
            if (node.Nodes.Count > 0)
            {
                nodes.AddRange(GetNodes(n));
            }
        }
        return nodes;
    }

使用

private void button1_Click(object sender, EventArgs e)
    {
        RemoveCheckBoxes(treeView1);
    }

关于c# - 禁用一个 TreeView 节点中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897683/

相关文章:

c# - .NET 会受益于 "named anonymous"类型吗?

c# - 回发后保持 css3 模式对话框打开

c# - ASP.NET MVC FileResult 到磁盘上的文件

c# - 在 Windows 应用程序的 EXE 中本地存储数据的最佳方法是什么

c# - 在面板上显示图像

c# - 自动调整使用自定义绘画的 DataGridViewComboBoxCell 的大小

c# - 在 .NET Core 1.1 中使用 System.IO.Ports.SerialPort

c# - 将键/值对绑定(bind)到 asp 标签的最佳方法是什么

c# - 替代输入设备(Midi)不会阻止 Winforms 应用程序中的屏幕保护程序

c# - 如何使用反射调用泛型类型内的非泛型方法