【发布时间】:2011-11-10 14:47:02
【问题描述】:
我正在使用具有三层节点的树视图,第二层是我使用this question 中的代码设置为没有复选框的。
它工作得很好,除了它遇到的第一个复选框从未删除过该复选框:
我正在使用这段代码调用 HideCheckBox() 方法,这是在所有数据都已加载到树视图中之后:
foreach (TreeNode appNode in trvPermissions.Nodes)
{
foreach (TreeNode secNode in appNode.Nodes)
{
HideCheckBox(trvPermissions, secNode);
}
}
当我单步执行代码时,node.Handle 似乎为它遇到的第一个节点返回 0,这不是调用代码以删除复选框时使用的有效句柄。奇怪的是,如果我调用该方法两次删除复选框,则句柄将正确返回。
谁能提出为什么 TreeNode.Handle 不会返回正确的值?
编辑:
这是所要求的代码 -
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);
}
【问题讨论】:
-
您可以在删除复选框并调用 node.Handle 的位置显示您的代码吗?
-
调用 HideCheckBox() 时 TreeView 是否可见?我的意思是 TreeView.Visible 设置为 true?