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

有没有办法从C#中树状视图控件的根节点中删除复选框?,c#,visual-studio,treeview,C#,Visual Studio,Treeview,如何删除下面给出的控件中标记的根节点的复选框 这就是我到目前为止所做的 private void SetRootNode(TreeNode node, int index) { IntPtr pt = treeViewFactMaps.Handle; TvItem tvi = new TvItem(); tvi.hItem = node.Handle; tvi.mask = TvifState; tvi.s

如何删除下面给出的控件中标记的根节点的复选框

这就是我到目前为止所做的

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);
    }
请注意,我只希望删除根节点的复选框。而不是子节点


我使用了Stack Overflow中一个类似问题的解决方案,可以在中找到,但它对我不起作用。

这里我有一个解决方案可以帮助您。您可以通过重新绘制和 “发送消息”

private void Form1\u加载(对象发送方,事件参数e)
{
this.treeView1.checkbox=true;
this.treeView1.DrawMode=TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode+=新的DrawTreeNodeEventHandler(treeViewGroupStatements\u DrawNode);
//根1
TreeNode root1=新的TreeNode();
root1.Text=“root1”;
TreeNode11=新的TreeNode();
node11.Text=“11”;
TreeNode12=新的TreeNode();
node12.Text=“12”;
root1.Nodes.Add(node11);
root1.Nodes.Add(node12);
treeView1.Nodes.Add(root1);
//根2
TreeNode root2=新的TreeNode();
root2.Text=“root2”;
TreeNode21=新的TreeNode();
node21.Text=“21”;
TreeNode22=新的TreeNode();
node22.Text=“22”;
root2.Nodes.Add(node21);
root2.Nodes.Add(node22);
treeView1.Nodes.Add(root2);
//获取所有根节点
foreach(treeView1.Nodes中的变量项)
{
如果((树节点)项).Level==0)
{
添加(((TreeNode)项).Text,true);
}
}
}
//定义一个字典来存储根目录
公共字典HideList=新字典();
私有void treeViewGroupStatements\u DrawNode(对象发送方,DrawTreeNodeEventTargets e)
{
HideLevelOfTreeView(e.Node);
e、 DrawDefault=true;
}
私有void HideLevelOfTreeView(TreeNode tn)
{
if(隐藏列表容器(tn.Text))
HideCheckBox(tn.TreeView,tn);
}
私有常量int TVIF_STATE=0x8;
私有常量int TVIS_stateMageMask=0xF000;
private const int TV_FIRST=0x1100;
私用const int TVM_SETITEM=TV_FIRST+63;
私有void HideCheckBox(TreeView tvw,TreeNode节点)
{
TviItem tvi=新的TviItem();
tvi.hItem=node.Handle;
tvi.mask=TVIF_状态;
tvi.stateMask=TVIS_stateMask;
tvi.state=0;
发送消息(tvw.Handle、TVM_设置项、IntPtr.Zero、参考tvi);
}
[StructLayout(LayoutKind.Sequential,Pack=8,CharSet=CharSet.Auto)]
私有结构项
{
公共int掩码;
公共IntPtr hItem;
公共国家;
公共int状态掩码;
[Marshallas(UnmanagedType.LPTStr)]
公共字符串lpszText;
公共int cchTextMax;
公共国际形象;
public int iSelectedImage;public int cChildren;public IntPtr lParam;
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
私有静态外部IntPtr SendMessage(IntPtr hWnd、int Msg、IntPtr wParam、ref TVTItem LPRAM);
测试结果,


这里我有一个可能对您有所帮助的解决方案。您可以通过重新绘制和 “发送消息”

private void Form1\u加载(对象发送方,事件参数e)
{
this.treeView1.checkbox=true;
this.treeView1.DrawMode=TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode+=新的DrawTreeNodeEventHandler(treeViewGroupStatements\u DrawNode);
//根1
TreeNode root1=新的TreeNode();
root1.Text=“root1”;
TreeNode11=新的TreeNode();
node11.Text=“11”;
TreeNode12=新的TreeNode();
node12.Text=“12”;
root1.Nodes.Add(node11);
root1.Nodes.Add(node12);
treeView1.Nodes.Add(root1);
//根2
TreeNode root2=新的TreeNode();
root2.Text=“root2”;
TreeNode21=新的TreeNode();
node21.Text=“21”;
TreeNode22=新的TreeNode();
node22.Text=“22”;
root2.Nodes.Add(node21);
root2.Nodes.Add(node22);
treeView1.Nodes.Add(root2);
//获取所有根节点
foreach(treeView1.Nodes中的变量项)
{
如果((树节点)项).Level==0)
{
添加(((TreeNode)项).Text,true);
}
}
}
//定义一个字典来存储根目录
公共字典HideList=新字典();
私有void treeViewGroupStatements\u DrawNode(对象发送方,DrawTreeNodeEventTargets e)
{
HideLevelOfTreeView(e.Node);
e、 DrawDefault=true;
}
私有void HideLevelOfTreeView(TreeNode tn)
{
if(隐藏列表容器(tn.Text))
HideCheckBox(tn.TreeView,tn);
}
私有常量int TVIF_STATE=0x8;
私有常量int TVIS_stateMageMask=0xF000;
private const int TV_FIRST=0x1100;
私用const int TVM_SETITEM=TV_FIRST+63;
私有void HideCheckBox(TreeView tvw,TreeNode节点)
{
TviItem tvi=新的TviItem();
tvi.hItem=node.Handle;
tvi.mask=TVIF_状态;
tvi.stateMask=TVIS_stateMask;
tvi.state=0;
发送消息(tvw.Handle、TVM_设置项、IntPtr.Zero、参考tvi);
}
[StructLayout(LayoutKind.Sequential,Pack=8,CharSet=CharSet.Auto)]
私有结构项
{
公共int掩码;
公共IntPtr hItem;
公共国家;
公共int状态掩码;
[Marshallas(UnmanagedType.LPTStr)]
公共字符串lpszText;
公共int cchTextMax;
公共国际形象;
public int iSelectedImage;public int cChildren;public IntPtr lParam;
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
私有静态外部IntPtr SendMessage(IntPtr hWnd、int Msg、IntPtr wParam、ref TVTItem LPRAM);
测试结果,

为什么和如何对我都不起作用?为什么和如何对我都不起作用?
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;
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);