c# - TreeNode.Handle 不使用 Treeview 返回

标签 c# treeview

我正在使用具有三级节点的 TreeView ,第二级我使用 this question 中的代码设置为没有复选框.

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

Example of error

我正在使用这段代码调用 HideCheckBox() 方法,这是在所有数据都已加载到 TreeView 之后:

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);
    }

最佳答案

真正的原因在您的代码中不可见。当您从表单构造函数调用此代码时,这将失败,如前所述。太早了,它只能在创建 native TreeView 窗口时起作用。直到那时 TreeNode.Handle 才获得一个值。使用 tvw.Handle 将触发 native 窗口句柄的创建,为时已晚,无法为第一个节点赋予 node.Handle 值。

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

关于c# - TreeNode.Handle 不使用 Treeview 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308238/

相关文章:

javascript - 如何: collapsible two tier org chart creation using CSS and jQuery

C# TreeView 设计 - 显示树结构的最佳方式?

c# - 如何从 VSTO 插件中找出当前版本的 Outlook?

c# - 将变量作为参数传递给 javascript 中的 Url.Action

c# - Entity Framework Linq何时查询Hints Sql数据库?

c# - CommandInvokationFailure : Unable to merge android manifests. 有关详细信息,请参阅控制台。我已经对项目中的所有 list 文件进行了更改

wpf - Gridsplitter 不调整大小

JavaFX TreeView 为空

c# - Silverlight 3 中的 TreeView 选择问题

c# - 退出代码 100。信号量过多