有没有办法从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);