[英]Show checkbox to root node in treeview C#
我希望对根节点而不是Treeview控件的子节点具有复选框。
- [x]Pie Chart report
- Sales report
- Sales Projection report
- Linear Sales report
- [x]Surface Chart report
- Sales report
- Sales Projection report
- Linear Sales report
- [x]Caligraph report
- Sales report
- Sales Projection report
- Linear Sales report
为此,我已经在常规的treeview控件中进行了更改
tvreport是Treeview控件
this.tvreport.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(tvreport_DrawNode);
this.tvreport.ShowLines = true;
this.tvreport.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
private void tvreport_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (IsContactNode(e.Node))
{
Color backColor, foreColor;
if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
{
backColor = SystemColors.Highlight;
foreColor = SystemColors.HighlightText;
}
if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)
{
backColor = SystemColors.HotTrack;
foreColor = SystemColors.HighlightText;
}
else
{
backColor = e.Node.BackColor;
foreColor = e.Node.ForeColor;
}
Rectangle newBounds = e.Node.Bounds;
newBounds.X = 60;
using (SolidBrush brush = new SolidBrush(backColor))
{
e.Graphics.FillRectangle(brush, e.Node.Bounds);
}
TextRenderer.DrawText(e.Graphics, e.Node.Text, this.tvreport.Font, e.Node.Bounds, foreColor, backColor);
if ((e.State & TreeNodeStates.Focused) == TreeNodeStates.Focused)
{
ControlPaint.DrawFocusRectangle(e.Graphics, e.Node.Bounds, foreColor, backColor);
}
e.DrawDefault = false;
}
else
{
e.DrawDefault = true;
tvContactList1.ShowRootLines = true;
tvContactList1.ShowLines = true;
}
}
private bool IsContactNode(TreeNode node)
{
return node.Parent != null;
}
运行代码后,发现根节点正在显示复选框,而子节点没有复选框[这就是我希望拥有的]。
但是问题是显示层次结构消失的“线”。 现在,我要填充这些行。 如何做到这一点。
TreeView删除某些节点的CheckBox是一种可能的解决方案。 此解决方案将TVM_SETITEM-Message发送到树视图。
借助以上链接,我可以实现我的要求。 在下面的代码中,只有在填充树视图中的节点之后才应调用HideCheckBox()函数。
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;
[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);
/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.