我希望有根节点的复选框,而不是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
为了实现这一点,我在常规树视图控件中进行了更改
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;
}
运行代码后发现根节点显示复选框,而子节点没有复选框[这就是我希望拥有的]。
但问题是显示层次结构消失的“线”。现在我想填充那些LINES。如何实现这一目标。
答案 0 :(得分:0)
TreeView Remove CheckBox by some Nodes是一种可能的解决方案。 此解决方案将TVM_SETITEM-Message发送到树视图。
答案 1 :(得分:0)
借助上述链接,我可以达到我的要求。在下面的代码中,只有在树视图中填充节点后才能调用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);
}