Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2014, 10:51   #1
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию C# TreeView дерево фамилий из базы

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

Авакумов
Агапова
Агарков
Будкин
Буров
Иванова
Искомов
Ежов


И нужно эти фамилии передать в TreeView для такого вида, где первая буква фамилии образует родительский узел дерева, а фамилии помещаются в дочерние

А
-Авакумов
-Агапова
-Агарков
Б
-Будкин
-Буров
И
-Иванова
-Искомов
Е
-Ежов


Читаю столбец из бд аксеса, передаю их в DataReader и потом в While цикле пытаюсь на лету сортировать и добавлять узлы в TreeView, но не очень получается.
Таксист вне форума Ответить с цитированием
Старый 11.12.2014, 10:58   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Таксист Посмотреть сообщение
потом в While цикле пытаюсь на лету сортировать
Таксист, откройте для себя оператор SQL ORDER BY и будет Вам счастье.
Цитата:
Сообщение от Таксист Посмотреть сообщение
но не очень получается.
В чём, конкретно, трудности?
Streletz вне форума Ответить с цитированием
Старый 11.12.2014, 11:09   #3
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Таксист, откройте для себя оператор SQL ORDER BY и будет Вам счастье.
В чём, конкретно, трудности?
ORDER BY это безусловно сила! Я имел ввиду, что отсортированный столбец после ORDER BY, не могу понять как запихнуть в TreeView. Беру в цикле while и достаю из DataReader каждую фамилию по алфавитному порядку, но не могу понять, как организовать проверку на добавление родительских узлов из первых букв фамилий и дочерних из фамилий.
Таксист вне форума Ответить с цитированием
Старый 11.12.2014, 11:48   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Можно, например, создать массив из букв алфавита и обходить его в цикле.
На каждом шаге текущую букву подставлять в оператор LIKE.
Таким образом, для каждой буквы алфавита будет сразу же формироваться необходимый набор данных, который можно добавить в treeview.
Streletz вне форума Ответить с цитированием
Старый 11.12.2014, 11:52   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но не очень получается.
Попытки в студию )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.12.2014, 12:28   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какой еще LIKE? Зачем 33 запроса делать?!

Можно же просто идти в цикле по отсортированному списку и добавлять в TreeView родительский узел если еще нет + саму фамилию.

Код:
            var names = new List<string> { "Авакумов", "Агапова", "Агарков", "Будкин", "Буров", "Иванова", "Искомов", "Ежов" };

            foreach (var name in names)
            {
                string letter = name[0].ToString();

                if (!treeView1.Nodes.ContainsKey(letter))
                {
                    treeView1.Nodes.Add(letter, letter); // key, text
                }

                var parentNode = treeView1.Nodes[letter];

                parentNode.Nodes.Add(name);
            }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.12.2014, 18:01   #7
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Какой еще LIKE? Зачем 33 запроса делать?!

Можно же просто идти в цикле по отсортированному списку и добавлять в TreeView родительский узел если еще нет + саму фамилию.
Спасибо Огромное! Алгоритм прекрасно работает. У меня еще один глупый вопрос, как можно передать в только что созданный дочерний узел значение Tag.


Например String tag ="Text";

Вот так Вы создавали узел и дочерний узел,

var parentNode = treeView1.Nodes[letter];
parentNode.Nodes.Add(name);

Вот я пробую так и оно естественно не работает(

parentNode.Nodes.Add(name).Tag = tag;
Таксист вне форума Ответить с цитированием
Старый 12.12.2014, 18:56   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
                var node = new TreeNode(name);
                node.Tag = tag;

                parentNode.Nodes.Add(node);
А зачем вам Tag?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.12.2014, 20:00   #9
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А зачем вам Tag?
Спасибо, все работает!
Я беру список фамилий из базы и в цикле по вашему алгоритму загоняю в Treeview, но необходимо в каждый дочерний элемент добавлять не только фамилию, но и id, что бы потом по клику в Treeview, по этому id из базы дергалась вся строка с информацией о пользователе и помещалась в label для отображения на форме.

Вот у меня так происходит по клику
Код:
  //Соеденяемся с базой и выбираем все фамилии, помещаем их в Reader

            var conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source= c:\ultra.mdb");
            conn.Open();
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM users ORDER BY full_name ASC", conn);
            OleDbDataReader reader = cmd.ExecuteReader();
            
            
            //В цикле формируем дерево

            while (reader.Read())
            {
 

                String familia = reader[2].ToString();  // Первая фамилия взятая из базы
                String letter = familia.Substring(0, 1); //Первая буква из фамилии


                if (!treeView1.Nodes.ContainsKey(letter))
                {
                    treeView1.Nodes.Add(letter, letter); // key, text
                }

            var parentNode = treeView1.Nodes[letter];

                var node = new TreeNode(familia);
                node.Tag = reader[0].ToString(); ;

                parentNode.Nodes.Add(node);
    

            }
            reader.Close();
            conn.Close();

Последний раз редактировалось Таксист; 12.12.2014 в 20:13.
Таксист вне форума Ответить с цитированием
Старый 12.12.2014, 20:12   #10
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от Таксист Посмотреть сообщение
необходимо в каждый дочерний элемент добавлять не только фамилию, но и id, что бы потом по клику в Treeview, по этому id из базы дергалась вся строка с информацией о пользователе и помещалась в label для отображения на форме
ИМХО, можно попробовать перед заполнением treeview загружать данные в 2х мерный массив (id, Фамилия). Потом вытаскивать из него id опираясь на "местоположение" элемента в treeview.
Фамилия, которая "идёт" в treeview не уникальное поле. Поэтому, сделать отбор по ней нельзя.

Последний раз редактировалось Streletz; 12.12.2014 в 22:40.
Streletz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не грузится дерево в TreeView artemavd Общие вопросы Delphi 0 23.04.2012 20:26
загрузить дерево из текстового файла в treeview hunter03 Помощь студентам 2 26.11.2011 15:42
Как связать дерево TreeView с таблицей StringGrid Serebah Общие вопросы Delphi 5 22.12.2010 17:50
обработчики добавления и удаления в дерево (TreeView) kayman Компоненты Delphi 10 08.03.2010 11:17
Выборка из списка фамилий определенных фамилий KNatalia Microsoft Office Excel 6 28.09.2009 05:31