TreeNode.Handle不使用Treeview返回

时间:2011-09-05 12:40:24

标签: c# treeview

我正在使用具有三级节点的树视图,第二级我使用this question中的代码设置了没有复选框。

它工作得非常好,除了它遇到的第一个复选框从未删除复选框:

Example of error

我正在使用此代码调用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);
    }

1 个答案:

答案 0 :(得分:10)

您的代码中看不到真正的原因。当您从表单构造函数调用此代码时,这将失败。太早,它只能在创建本机TreeView窗口时工作。直到那时TreeNode.Handle才获得一个值。使用tvw.Handle将触发本机窗口句柄的创建,为命令提供节点。为第一个节点处理一个值。

将代码移动到Load事件处理程序或OnLoad覆盖。