Форум программистов, компьютерный форум, киберфорум
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. Показов 2583. Ответов 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
2297 / 1613 / 400
Регистрация: 26.06.2017
Сообщений: 4,777
Записей в блоге: 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
2297 / 1613 / 400
Регистрация: 26.06.2017
Сообщений: 4,777
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru