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

@Kevin Vizalil

Вы можете использовать API Github для получения списка проблем или отдельной проблемы

, пожалуйста, проверьте https://developer.github.com/v3/issues/#list-issues

редактировать:

[ 116], например, https://api.github.com/repos/vmg/redcarpet/issues?sort=created&direction=desc

18
задан Kiquenet 26 November 2014 в 12:47
поделиться

3 ответа

Поскольку в C ++ есть поддержка, мы можем решить ее с помощью p / invoke.

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

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

    } 

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

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

В вашей функции tree_DrawNode определите, должен ли нарисованный узел иметь флажок, и скрыть его при оценке. Затем установите для свойства 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);
}
33
ответ дан 30 November 2019 в 07:44
поделиться

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

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

0
ответ дан 30 November 2019 в 07:44
поделиться

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

Эта ссылка могла бы представлять Ваш интерес.

0
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: