@Naratzull
C#/C++ Developer

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

Я тут создаю диалоговый редактор для игры и у меня появилась проблема, которую я никак не могу решить. Как можно реализовать подобную вещь:
  1. Есть два вместе находящихся элемента на форме RichTextBox и один TreeView.
  2. В TreeView с помощью кнопки добавляются узлы.
  3. При нажатии на узел активируется первый RichTextBox, при нажати на его подузел второй RichTextBox (первый вырубается).
  4. В данный RichTextBox можно что-то вписать и это сохраниться в выбранном узле/подузле (не в двух сразу).
  5. Если юзер нажмет на другой узел или их подузел, то RichTextBox очистится, но при повторном нажатии на тот прошлый узел те, ранее вписанные данные, вновь появятся в RichTextBox.
  6. И так можно привязывать данные к любому выбранному узлу.
  7. Данные каждого узла я смогу получить через код в будущем.

Меня больше всего интересует 4,5,6 и 7 пункты. Остальное я уже реализовал, а вот с этими я даже не представляю как. Я знаю про существование Tag у узлов, но это не дает мне никакого представления реализации подобного. Заранее спасибо за ответ.
  • Вопрос задан
  • 339 просмотров
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Первые 2 класса хранят данные, загружают из бд, ну тут сами придумаете. См LoadData
Последний это форма обрабатываются события NodeMouseClick и TextChanged на текст боксах.
Логика простейшая, но это в общем то пример, в реальности усложните по вкусу.
using System.Collections.Generic;

namespace TreeViewBinding.Code
{
    public class TreeSource
    {
        public TreeSource()
        {
            Leaves = new List<TreeLeaf>();
        }
        public List<TreeLeaf> Leaves { get; set; }

        /// <summary>
        /// Load data stub. In this example use mock data. In real application load data from database or web service
        /// </summary>
        public void LoadData()
        {
            var first = new TreeLeaf { Description = "First description", Title = "First" };
            var firstSubs = new[]
            {
                new TreeLeaf(first){Description = "First desc",Title = "First"},
                new TreeLeaf(first){Description = "Second desc",Title = "Second"},
                new TreeLeaf(first){Description = "Third desc",Title = "Third"}
            };
            first.Leaves.AddRange(firstSubs);
            var second = new TreeLeaf { Description = "Second description", Title = "Second" };
            var third = new TreeLeaf { Description = "Third description", Title = "Third" };
            Leaves.AddRange(new[]
            {
                first,
                second,
                third,
            });
        }
    }
}


using System.Collections.Generic;

namespace TreeViewBinding.Code
{
    public class TreeLeaf
    {
        public TreeLeaf(TreeLeaf parent = null)
        {
            Leaves = new List<TreeLeaf>();
            Parent = parent;
        }
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string Icon { get; set; }
        public List<TreeLeaf> Leaves { get; private set; }
        public TreeLeaf Parent { get; private set; }
    }
}


#region License
// // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// // email: koroten@ya.ru
// // skype:vladimir-korotenko
// // https://vkorotenko.ru
// // Создано:  09.05.2020 8:26
#endregion

using System.Collections.Generic;
using System.Windows.Forms;
using TreeViewBinding.Code;

namespace TreeViewBinding
{
    public partial class TreeViewBindingForm : Form
    {
        private TreeSource _treeSource;
        private TreeLeaf _currentLeaf;
        private TreeNode _node;
        public TreeViewBindingForm()
        {
            InitializeComponent();
            _treeSource = new TreeSource();
            _treeSource.LoadData();
            FillInTree(treeView.Nodes, _treeSource.Leaves);
        }

        private static void FillInTree(TreeNodeCollection  nodes, IEnumerable<TreeLeaf> leafs)
        {
            foreach (var leaf in leafs)
            {
                var treeNode = new TreeNode(leaf.Title) {Tag = leaf};
                nodes.Add(treeNode);
                if (leaf.Leaves.Count > 0) FillInTree(treeNode.Nodes, leaf.Leaves);
            }
        }

        private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Tag is TreeLeaf item)
            {
                _node = e.Node;
                _currentLeaf = item;
                titleTextBox.Text = item.Title;
                descriptionTexBox.Text = item.Description;
            }
        }

        private void titleTextBox_TextChanged(object sender, System.EventArgs e)
        {
            if (_node != null)
            {
                _currentLeaf.Title = _node.Text = titleTextBox.Text;
            }
        }

        private void descriptionTexBox_TextChanged(object sender, System.EventArgs e)
        {
            if (_node != null)
            {
                _currentLeaf.Description = descriptionTexBox.Text;
            }
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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