Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
.NET 4.x

BrightIdeasSoftware TreeListView Восстановление выделенных данных и управление древовидным списком класа

14.08.2024, 10:29. Показов 2594. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Надеюсь кто поможет. Пара вопросов.
1 озвучивал в другой теме. А именно как восстановить выделенные данные с учётом выделения в самом TreeListView.
2. Есть класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Serializable]
public class RMText
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string OriginalText { get; set; }
    public Dictionary<string, string> Text { get; set; }
    public BindingList<RMText> RMTexts { get; set; }
 
    public RMText(int id, string name)
    {
        ID = id;
        Name = name;
        OriginalText = "";
        Text = new Dictionary<string, string>();
        RMTexts = new BindingList<RMText>();
    }
}
 
public class RMSettingsTexts
{
    public BindingList<RMText> RMTexts { get; set; }
 
    public RMSettingsTexts()
    {
        RMTexts = new BindingList<RMText>();
    }
}
}
Так вот через TreeListView или его аналог нужно изменять данные в самом BindingList<RMText>; То есть передать TreeListView.Roots нужно не просто копию списка а ссылку чтобы изменяя данные в TreeListView они менялись и в классе. Ну или другим способ получать доступ к вхождению дерева RMTexts для изменений данных. Проще говора это древовидный редактор текста с учётом оригинального и под каждую локаль.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2024, 10:29
Ответы с готовыми решениями:

Ошибка в работе с древовидным списком.
В программе я использую окно с древовидным списком.Для выделения файлов в ветвях (от родителья к предкам)списка я использую метод SetCheck ...

Запись данных в textBox1 из класа
создал клас: class delegat { TextBox p = new TextBox(); public void form1(TextBox o) { ...

управление списком
похоже, я уже уперся..-( Есть список, заполняется из таблицы по запросу. Задача - заполнять его выборкой по условию. И не получается. То...

32
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
11.09.2024, 14:14  [ТС]
Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
treeListViewRMTexts.CanExpandGetter = obj => ((RMText)obj).IsCount;
 
treeListViewRMTexts.ChildrenGetter = obj =>
{
    try
    {
        return ((RMText)obj).RMTexts;
    }
    catch (UnauthorizedAccessException ex)
    {
        // on error (e.g. restricted system dirs) show message box and collapse the subtree allowing the user to retry later
        // we cannot do this immediately in this getter because TreeListView will not react correctly and may remain in undefined state
        // so we use BeginInvoke to execute it a bit later on the UI thread
        BeginInvoke(new Action(() =>
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            treeListViewRMTexts.Collapse(obj);
        }));
        return new List<RMText>();
    }
};
 
treeListViewRMTexts.ParentGetter = obj => ((RMText)obj).Parent;
 
bs.DataSource = RMSettingsTexts.RMTexts;
treeListViewRMTexts.Objects = bs;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void AddNodeBranch(bool isNode = true)
{
    string getSubKey()
    {
        return isNode ? "Node" : "Branch";
    }
 
    var rmNameNodeBranch = "";
    if (InputTextBox.Show(this, Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Text")),
        $"{this.Text} > {Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Caption"))}",
        Languages.TX_ButtonOK,
        Languages.TX_ButtonCancel, ref rmNameNodeBranch) == DialogResult.OK)
    {
        if (isNode)
        {
            treeListViewRMTexts.AddObject(new RMText(RMSettingsTexts.RMTexts.Count, rmNameNodeBranch));
            treeListViewRMTexts.RebuildAll(true);
        }
        else
        {
            
        }
    }
}
По прежнему данные в RMSettingsTexts.RMTexts не обновляются.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,139
Записей в блоге: 1
11.09.2024, 14:39
Alexandr_7,
вы добавляете новый объект в сам контрол (дерево) или в коллекцию?
и где вызов bs.ResetBindings() ?
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
11.09.2024, 14:41  [ТС]
Цитата Сообщение от NewOrdered Посмотреть сообщение
Alexandr_7,
вы добаляете новый объект в сам контрол (дерево) или в коллекцию?
и где вызов bs.ResetBindings() ?
В сам контрол.
Ну я могу узлы добавлять и в RMSettingsTexts.RMTexts но как тогда быть с ветвями?
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,139
Записей в блоге: 1
11.09.2024, 14:53
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну я могу узлы добавлять и в RMSettingsTexts.RMTexts но как тогда быть с ветвями?
1. Из выделенного в дереве элемента (неважно, корневой он или нет) получаете имя (или другой идентификатор) объекта в коллекции.
2. По этому имени/идентификатору находите объект в коллекции и выполняете с ним манипуляции: удалить, изменить, добавить потомка. Эта логика должна быть на уровне работы с коллекцией, а не с деревом.
3. Обновляете отображение (дерево).
4. При необходимости выделяете программно нужный элемент: добавленный, измененный или родительский (при удалении).
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
11.09.2024, 15:07  [ТС]
Цитата Сообщение от NewOrdered Посмотреть сообщение
1. Из выделенного в дереве элемента (неважно, корневой он или нет) получаете имя (или другой идентификатор) объекта в коллекции.
2. По этому имени/идентификатору находите объект в коллекции и выполняете с ним манипуляции: удалить, изменить, добавить потомка. Эта логика должна быть на уровне работы с коллекцией, а не с деревом.
3. Обновляете отображение (дерево).
4. При необходимости выделяете программно нужный элемент: добавленный, измененный или родительский (при удалении).
Сама структура коллекции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[Serializable]
public class RMText
{
    private RMText _parent;
 
    public int ID { get; set; }
    public string Name { get; set; }
    public string OriginalText { get; set; }
    public Dictionary<string, string> Text { get; set; }
    public List<RMText> RMTexts { get; set; }
 
    [JsonIgnore]
    public RMText Parent { get => _parent; }
    [JsonIgnore]
    public bool IsCount => RMTexts.Count > 0;
 
    public RMText()
    {
        _parent = null;
        ID = -1;
        Name = "";
        OriginalText = "";
        Text = new Dictionary<string, string>();
        RMTexts = new List<RMText>();
    }
 
    public RMText(int id, string name)
    {
        _parent = null;
        ID = id;
        Name = name;
        OriginalText = "";
        Text = new Dictionary<string, string>();
        RMTexts = new List<RMText>();
    }
 
    public RMText(RMText parent, int id, string name)
    {
        _parent = parent;
        ID = id;
        Name = name;
        OriginalText = "";
        Text = new Dictionary<string, string>();
        RMTexts = new List<RMText>();
    }
}
Тут может выходить так что будут одинаковые имена и данные. Я не понимаю как в таком случае делать поиск выбранного элемента этой коллекции.
Мне бы пример реализации добавление ветвей.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,139
Записей в блоге: 1
11.09.2024, 15:27
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Тут может выходить так что будут одинаковые имена и данные. Я не понимаю как в таком случае делать поиск выбранного элемента этой коллекции.
Тогда вместо п.п. 1 и 2 приводите .SelectedObject у дерева к типу объекта коллекции (ну и родительский, если нужно, тоже) и получается ссылка на нужный объект (поиск по коллекции не требуется).

C#
1
var selectedRMText = treelistView1.SelectedObject as RMText;
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Мне бы пример реализации добавление ветвей.
У List<T> есть метод .Add()

C#
1
selectedRMText.RMTexts.Add(newRMText);
Если у вас какая-то сложная логика добавления, то можно создать метод расширения .AddRMText() для List<RMText>, поместить логику добавления туда и вызывать уже его

C#
1
selectedRMText.RMTexts.AddRMText(newRMText);
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
11.09.2024, 15:28
NewOrdered, вот тут вы приводите логику работы никак не связанную с привязкой данных, но при этом тут утверждаете, что привязка поддерживается. Так привязка данных реализована в этом TreeView или нет? Выше я приводил ссылку на справку от производителя, который утверждает, что некая привязка есть.
Ещё раз как должна работать привязка смотрим тут.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,139
Записей в блоге: 1
11.09.2024, 15:45
Uswer, Все верно, двусторонний data-binding есть, но только у другой разновидности. И там конечно же не требуются мной упомянутые действия, все реализовано под капотом. У используемой автором разновидности (TreeListView) ее нет (тут я действительно напутал), поэтому требуются дополнительные действия/компоненты, чтобы реализовать нужный автору функционал.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
11.09.2024, 16:58  [ТС]
C#
1
2
var selectedRMText = treelistView1.SelectedObject as RMText;
selectedRMText.RMTexts.Add(newRMText);
Таким способом добавлять? Ну это тогда понятно. Просто разве selectedRMText будет соддержать ссылку на нужный RMText?
Ну хотя по идеи да. Ибо мне из за этого пришлось писать клонирование класса чтобы во время настройки менять значения не в основном классе а в копии объекта.

Добавлено через 11 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void AddNodeBranch(bool isNode = true)
{
    string getSubKey()
    {
        return isNode ? "Node" : "Branch";
    }
 
    var rmNameNodeBranch = "";
    if (InputTextBox.Show(this, Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Text")),
        $"{this.Text} > {Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Caption"))}",
        Languages.TX_ButtonOK,
        Languages.TX_ButtonCancel, ref rmNameNodeBranch) == DialogResult.OK)
    {
        if (isNode)
        {
            RMSettingsTexts.RMTexts.Add(new RMText(RMSettingsTexts.RMTexts.Count + 1, rmNameNodeBranch));
        }
        else
        {
            var selRMText = treeListViewRMTexts.SelectedObject as RMText;
            selRMText.RMTexts.Add(new RMText(selRMText, selRMText.RMTexts.Count + 1, rmNameNodeBranch));
        }
 
        bs.ResetBindings(true);
        treeListViewRMTexts.RebuildAll(true);
    }
}
Это работает но при добавлении узла данные в treeListViewRMTexts не обновляются
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,139
Записей в блоге: 1
12.09.2024, 12:56
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Это работает но при добавлении узла данные в treeListViewRMTexts не обновляются
то есть дочерние узлы/ветви добавляются, а корневые узлы нет?

Добавлено через 2 часа 38 минут
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Знает кто аналог TreeView с привязкой данных под WinForms?
Кстати Syncfusion раздает Community license для индивидуальных разработчиков и небольших команд.
То есть можно (разумеется с определенными ограничениями) бесплатно пользоваться их контролами для разработки приложений.
Их TreeView поддерживает привязку данных и имеет кучу других фич
https://www.syncfusion.com/win... s/treeview
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
12.09.2024, 17:53  [ТС]
Цитата Сообщение от NewOrdered Посмотреть сообщение
то есть дочерние узлы/ветви добавляются, а корневые узлы нет?
Они добавляются они не отображаются до момента пересоздания bs
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
14.09.2024, 01:38  [ТС]
Так кто знает как решить данную проблему. Я попробовал несколько и рабочий способ:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void AddNodeBranch(bool isNode = true)
{
    string getSubKey()
    {
        return isNode ? "Node" : "Branch";
    }
 
    var rmNameNodeBranch = "";
    if (InputTextBox.Show(this, Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Text")),
        $"{this.Text} > {Languages.Translate(Gen.GetMsgCode($"RMCreateText_InputName{getSubKey()}Caption"))}",
        Languages.TX_ButtonOK,
        Languages.TX_ButtonCancel, ref rmNameNodeBranch) == DialogResult.OK)
    {
        if (isNode)
        {
            RMSettingsTexts.RMTexts.Add(new RMText(RMSettingsTexts.RMTexts.Count + 1, rmNameNodeBranch));
        }
        else
        {
            var selRMText = treeListViewRMTexts.SelectedObject as RMText;
            selRMText.RMTexts.Add(new RMText(selRMText, selRMText.RMTexts.Count + 1, rmNameNodeBranch));
            
        }
 
        bs.ResetBindings(true);
        [B]treeListViewRMTexts.Objects = bs;[/B]
        treeListViewRMTexts.RebuildAll(true);
    }
}
Но это немного глупо хотя и работает.
0
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
14.09.2024, 22:38
Alexandr_7, ради ознакомления я потестил DataTreeListView, там привязка данных работает намного лучше, хотя нежданчики даже при поверхностном тестировании вылезли. Почему бы Вам просто не заменить элемент управления? Так как DataTreeListView прямой потомок TreeListView, то изменения в коде будут минимальны.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.09.2024, 22:38

Работа с комбобоксом(управление списком)
По умолчанию, список комбобокса выезжает вниз. Если же комбобокс расположен в самом низу экрана, то список выезжает вверх. А как то можно...

управление односвязным списком(частично решено)
задача создать 6 процедур или функций 1 - добавление в начало списка *сделал 2 - добавление в конец списка 3 - удаление из начала...

Списки. Управление списком чисел по командам, записанным в файл
Напишите программу, которая управляет списком чисел по командам, записанным в файл input.txt . Сначала список пустой. Существует две...

[Решено] Проблемы с древовидным QAbstractModelItem
Доопределил, первый уровень вложенности работает. Для второго уровня вложенности генерятся индексы (приходит и верно обрабатывается...

Восстановление данных/восстановление массива RAID 1
Приветствую всех! У меня трагедия, заглючил мой iStor 608 с программным RAID 1. Надо как то восстановить RAID. Оба HDD имеют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru