Подтвердить что ты не робот

Как отключить флажок WinForms TreeView node?

Мне нужно отключить некоторые флажки в элементе управления TreeView приложения WinForms, но нет такой функциональности, встроенной в стандартный элемент управления TreeView.

Я уже использую событие TreeView.BeforeCheck и отменяю его, если node отключен и работает отлично.

Я также изменяю ForeColor отключенных узлов на GrayText.

Есть ли у кого-нибудь простое и надежное решение?

4b9b3361

Ответ 1

Так как поддержка в С++ мы можем решить, используя p/invoke.

Здесь настройка для части p/invoke, просто сделайте ее доступной для вызывающего класса.

    // constants used to hide a checkbox
    public const int TVIF_STATE = 0x8;
    public const int TVIS_STATEIMAGEMASK = 0xF000;
    public const int TV_FIRST = 0x1100;
    public const int TVM_SETITEM = TV_FIRST + 63;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
    IntPtr lParam); 

    // struct used to set node properties
    public 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;

    } 

Мы хотим определить на основе node на основе node. Самый простой способ сделать это - провести событие node. Мы должны установить, что наше дерево должно быть установлено как владелец, нарисованный для этого события, поэтому обязательно установите его для чего-то другого, кроме значения по умолчанию.

this.tree.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.tree.DrawNode += new DrawTreeNodeEventHandler(tree_DrawNode);

В вашей функции tree_DrawNode определите, должен ли быть установлен node флажок, и скрыть его при approriate. Затем установите для свойства Default Draw значение true, так как мы не хотим беспокоиться о том, чтобы рисовать все остальные детали.

void tree_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node.Level == 1)
    {
        HideCheckBox(e.Node);
        e.DrawDefault = true;
    }
    else 
    {
        e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font,
           Brushes.Black, e.Node.Bounds.X, e.Node.Bounds.Y);
    }
}

Наконец, фактический вызов функции, которую мы определили:

private void HideCheckBox(TreeNode node)
{
    TVITEM tvi = new TVITEM();
    tvi.hItem = node.Handle;
    tvi.mask = TVIF_STATE;
    tvi.stateMask = TVIS_STATEIMAGEMASK;
    tvi.state = 0;
    IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
    Marshal.StructureToPtr(tvi, lparam, false);
    SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
}

Ответ 2

TreeView.BeforeCheck - зарегистрируйтесь для этого события, проверьте, есть ли node, где флажки разрешены для проверки или нет, и, если он не может быть проверен, вы можете отменить событие, установив свойство Отмена на TreeViewCancelEventArgs. Это должно надеяться, что пользователь не сможет проверить эти поля, но не сделает для себя лучший пользовательский опыт.

Чтобы удалить флажки для не подлежащих проверке элементов, вы можете использовать draw-draw для рисования сплошного прямоугольника над флажком, чтобы удалить его.

Ответ 3

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

Этот ссылка может вас заинтересовать.