Как добавить кнопку рядом с каждым узлом TreeView? - PullRequest
7 голосов
/ 29 декабря 2011

Как добавить кнопку рядом с каждым узлом TreeView?

Ответы [ 3 ]

12 голосов
/ 30 декабря 2011

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

К счастью, есть простой выход: вам не нужно делать ничего такого сложного, потому что вы не должны делать это!

Вы когда-нибудь видели элемент управления деревом с кнопками в нем?Нет. Поэтому, если в вашем древовидном элементе управления есть кнопки, ваши конечные пользователи будут рассматривать его как причудливое.

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

3 голосов
/ 30 декабря 2011

Вот сайт, на котором я нашел проект с исходным кодом на codeproject, где кто-то действительно выполнил то, что вы пытаетесь сделать .. надеюсь, это поможет вам

Как поставить кнопкивнутри древовидной структуры Это ссылка CodeProject, в которой у проекта фактически есть источник, который можно использовать вместе с рабочим проектом.удачи

2 голосов
/ 19 августа 2013

Самый простой способ сделать это - нарисовать дерево самостоятельно.Вот небольшой пример (обратите внимание, что PushButtonState находится внутри пространства имен System.Windows.Forms.VisualStyles):

public class CustomTreeView : TreeView
{
    private Rectangle buttonRect = new Rectangle(80, 2, 50, 26);
    private StringFormat stringFormat;

    public CustomTreeView()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        DrawMode = TreeViewDrawMode.OwnerDrawText;
        ShowLines = false;
        FullRowSelect = true;
        ItemHeight = 30;

        stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Near;
        stringFormat.LineAlignment = StringAlignment.Center;
    }

    protected override void OnDrawNode(DrawTreeNodeEventArgs e)
    {
        e.Graphics.DrawString(e.Node.Text, this.Font, new SolidBrush(this.ForeColor), e.Bounds, stringFormat);
        ButtonRenderer.DrawButton(e.Graphics, new Rectangle(e.Node.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size), "btn", this.Font, true, (e.Node.Tag != null) ? (PushButtonState)e.Node.Tag : PushButtonState.Normal);
    }

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {
        if (e.Node.Tag != null && (PushButtonState)e.Node.Tag == PushButtonState.Pressed)
        {
            e.Node.Tag = PushButtonState.Normal;
            MessageBox.Show(e.Node.Text + " clicked");
            // force redraw
            e.Node.Text = e.Node.Text;
        }
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        TreeNode tnode = GetNodeAt(e.Location);
        if (tnode == null) return;

        Rectangle btnRectAbsolute = new Rectangle(tnode.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size);
        if (btnRectAbsolute.Contains(e.Location))
        {
            tnode.Tag = PushButtonState.Pressed;
            tnode.Text = tnode.Text;
        }
    }
}

Кроме того, вы можете достичь этого даже без создания пользовательского элемента управления - просто добавьте эти обработчики событий встандартное TreeView

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