【问题标题】:Disable checkbox in one TreeView Node [duplicate]在一个 TreeView 节点中禁用复选框 [重复]
【发布时间】:2016-10-06 13:43:15
【问题描述】:

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

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

这是我的 TreeView :

及其代码:

        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”上的复选框 - 仅在此。孩子的复选框应该在这里。

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这是一个简单的实现..:

      private void tree_BeforeCheck(object sender, TreeViewCancelEventArgs e)
      {
          // disable checking of nodes with children:
          if (e.Node.Nodes.Count > 0) e.Cancel = true;
          // disable checking of children:
          if (e.Node.Parent != null) e.Cancel = true;
      }
      

      你需要决定如何处理孩子..

      【讨论】:

      • 我试过了,但我仍然可以用孩子的节点检查节点
      • 是的。那是你写的。你想要什么?没有带子节点的节点,也没有带父节点的节点?简单的。我已经添加了额外的行。或者你的意思是你仍然可以检查有孩子的节点???然后已经忘记hook up the event- 你不能只是把它复制到代码中;它必须与活动挂钩!!
      • 我确实将它与 BeforeCheck 事件挂钩!
      • 嗯,它在这里工作。事件代码是否在调试器中被命中?
      猜你喜欢
      • 2016-07-17
      • 2010-11-04
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-06-18
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多