有没有办法从 C# 的树视图控件中的根节点中删除复选框?

Is there a way to remove a check box from a root node in a Tree View Control in C#?

如何去掉下面给出的控件中标记的根节点的复选框?

这是我目前所做的。

private void SetRootNode(TreeNode node, int index)
    {
        IntPtr pt = treeViewFactMaps.Handle;
        TvItem tvi = new TvItem();
        tvi.hItem = node.Handle;
        tvi.mask = TvifState;
        tvi.stateMask = TvisStateimagemask;
        tvi.state = index << 12;
        SendMessage(node.TreeView.Handle, TvmSetitem, IntPtr.Zero,ref tvi);
    }

上面的方法是在一个叫做"InitializeFactMaps()"的方法中调用的。

treeViewFactMaps.Nodes.Clear();
        bool selectFirstNode = true;
        TreeNode firstNode = null;
        foreach (DataSource ds in Sample.DataSources)
        {
            TreeNode root = treeViewFactMaps.Nodes.Add(ds.ItemName);
            if (selectFirstNode)
            {
                firstNode= root;
                selectFirstNode = false;
            }
            SetImage(root, false, false);
            SetRootNode(root, 0);
            foreach (DataSource childSource in ds.Children)
            {
                TreeNode leaf =  root.Nodes.Add(childSource.ItemName);
                leaf.Checked = Sample.UsedFactMaps.ContainsKey(childSource.FactId);
                leaf.Tag = childSource.FactId;
                SetImage(leaf, false, true);
            }
        }
        treeViewFactMaps.CollapseAll();
        treeViewFactMaps.Sort();
        treeViewFactMaps.SelectedNode = firstNode;

请注意,我只想删除根节点的复选框。不是子节点。

我已经使用了针对 Stack Overflow 中类似问题发布的解决方案,可以在 TreeView Remove CheckBox by some Nodes 找到,但它对我不起作用。

这里我有一个可能对你有帮助的解决方案。您可以通过重绘和 "SendMessage".

private void Form1_Load(object sender, EventArgs e)
{
    this.treeView1.CheckBoxes = true;
    this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
    this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeViewGroupStatements_DrawNode);
    // root1
    TreeNode root1 = new TreeNode();
    root1.Text = "root1";
    TreeNode node11 = new TreeNode();
    node11.Text = "11";
    TreeNode node12 = new TreeNode();
    node12.Text = "12";
    root1.Nodes.Add(node11);
    root1.Nodes.Add(node12);
    treeView1.Nodes.Add(root1);
    // root2
    TreeNode root2 = new TreeNode();
    root2.Text = "root2";
    TreeNode node21 = new TreeNode();
    node21.Text = "21";
    TreeNode node22 = new TreeNode();
    node22.Text = "22";
    root2.Nodes.Add(node21);
    root2.Nodes.Add(node22);
    treeView1.Nodes.Add(root2);

    // get all root nodes
    foreach (var item in treeView1.Nodes)
    {
        if(((TreeNode)item).Level == 0)
        {
            HideList.Add(((TreeNode)item).Text, true);
        }
    }
}

// define a dictionary to store the root
public Dictionary<string, bool> HideList = new Dictionary<string, bool>();

private void treeViewGroupStatements_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    HideLevelOfTreeView(e.Node);
    e.DrawDefault = true;
}

private void HideLevelOfTreeView(TreeNode tn)
{
    if (HideList.ContainsKey(tn.Text))
        HideCheckBox(tn.TreeView, tn);
}

private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;
private void HideCheckBox(TreeView tvw, TreeNode node)
{
    TVITEM tvi = new TVITEM();
    tvi.hItem = node.Handle;
    tvi.mask = TVIF_STATE;
    tvi.stateMask = TVIS_STATEIMAGEMASK;
    tvi.state = 0;
    SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]

private 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", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam);

测试结果,