TreeNode.Handle не возвращается с использованием Treeview

Я использую древовидное представление с тремя уровнями узлов, второй уровень, который я установил, чтобы не иметь флажков, используя код из этого вопроса .

Он работает очень хорошо, за исключением того, что в самом первом обнаруживаемом флажке этот флажок никогда не снимается:

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

    /// 
    /// Hides the checkbox for the specified node on a TreeView control.
    /// 
    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);
    }

6
задан Community 23 May 2017 в 12:07
поделиться