TreeNode.Handle не возвращается с помощью Treeview - PullRequest
6 голосов
/ 05 сентября 2011

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

Работает очень хорошокроме самого первого флажка, с которым он сталкивается, флажок никогда не снимается:

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 Ответ

10 голосов
/ 05 сентября 2011

Истинная причина не видна в вашем коде. Это не удастся, как описано, когда вы вызываете этот код из конструктора формы. Слишком рано, он может работать только при создании собственного окна TreeView. Только тогда TreeNode.Handle получит значение. Использование tvw.Handle инициирует создание дескриптора собственного окна, слишком поздно, чтобы дать ноду. Значение для первого узла.

Перемещение кода в обработчик события Load или переопределение OnLoad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...