Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63

Выборка из MSSQLServer значений в treeView

02.06.2017, 16:15. Показов 1911. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня.
Туплю, прошу помощи.
Имеется БД

ID int Unchecked
title varchar(255) Unchecked
parentID int Checked

Есть код

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
namespace WinTest.Forms
{
    public partial class FormTreeLeft : DockContent
    {
        public FormTreeLeft()
        {
            InitializeComponent();
        }
 
        private void BuildNodes(SqlConnection connection, TreeNodeCollection nodes, string tableName)
        {
            treeView1.BeginUpdate();
            using (var command = new SqlCommand(string.Format("SELECT * FROM myTable", tableName), connection))
            using (var reader = command.ExecuteReader())
            {
                var table = reader.GetSchemaTable();
                foreach (DataRow col in table.Rows)
                    nodes.Add(col[0].ToString());
            }
            treeView1.EndUpdate();
        }
 
        private void FormTreeLeft_Shown(object sender, EventArgs e)
        {
            using (var connection = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=DB;Integrated Security=True"))
            {
                connection.Open();
                BuildNodes(connection, treeView1.Nodes, "myTable");
                treeView1.ExpandAll();
            }
        }
    }
}
В treeview выводятся имена столбцов, а не значения столбцов.
Прошу подмочь в решении
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2017, 16:15
Ответы с готовыми решениями:

Сравнение значений между собой в порядке даты и выборка отрицательных значений разницы
Уважаемые, Помогите решить следующую нетривиальную задачу есть таблица следующего вида (название столбцов) артикуль ...

Выборка финальных значений в промежутке и нахождение несуществующих значений
всем привет! прошу помощи начинающему, есть 3 таблицы: две из них - с данными о товарах (на уровне магазина и области), третья -...

Дана выборка из 10 значений. Расширить ее до 100 значений.
Дана выборка из 10 чисел, расширить её до 100. Посоветовали функцию BOOTSTRP. Но смог найти только более менее сносный параметр...

15
36 / 34 / 20
Регистрация: 17.03.2015
Сообщений: 175
02.06.2017, 16:37
Добрый день.
Была подобная задача, только нужно было вывести значения столбца в ComboBox.
C#
1
2
3
4
5
6
                SqlDataAdapter adapter_1 = new SqlDataAdapter("select * from books", sql_connection);
                DataTable table_1 = new DataTable();
                table_1.Locale = System.Globalization.CultureInfo.InvariantCulture;
                adapter_1.Fill(table_1);
                name_issue_book.DataSource = table_1;
                name_issue_book.DisplayMember = table_1.Columns["Название"].ColumnName;
Попробуйте, может и вам поможет такой код.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
02.06.2017, 17:19
GuardianCoder, метод GetSchemaTable() возвращает DataTable описывающий схему данных - колонки, их типы и другие метаданные. Самих данных там нет. Нужно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void BuildNodes(SqlConnection connection, TreeNodeCollection nodes, string tableName)
        {
            treeView1.BeginUpdate();
            try
            {
                using (var command = new SqlCommand("SELECT * FROM myTable", connection))
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        nodes.Add((string)reader["title"]);
                    }
                }
            }
            finally
            {
                treeView1.EndUpdate();
            }
        }
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
02.06.2017, 17:35  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужно сделать так:
OwenGlendower, спасибо за разъяснение. В целом, примерно что-то похожее уже написал и я к моменту Вашего ответа. Но в Вашем коде выводится значение столбцов title.
А как вывести в форме дерева?
Название: 1.jpg
Просмотров: 105

Размер: 26.8 Кб
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
07.06.2017, 11:33  [ТС]
UP АП! Актуально...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.06.2017, 12:33
Лучший ответ Сообщение было отмечено GuardianCoder как решение

Решение

Цитата Сообщение от GuardianCoder Посмотреть сообщение
Выборка из MSSQLServer значений в treeView
1) Модель данных. Сделаем простейший репозиторий, загружающий БД в DataSet:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    static class Repository
    {
        public static DataSet DataSet { get; private set; }
 
        public static void LoadDataSet()
        {
            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Default"].ConnectionString))
            {
                DataSet = new DataSet();
                LoadTable(conn, "Table");
            }
        }
 
        private static void LoadTable(SqlConnection conn, string tableName)
        {
            var sql = string.Format("select * from [{0}]", tableName);
            var table = DataSet.Tables.Add(tableName);
            new SqlDataAdapter(sql, conn).Fill(table);
        }
    }

Репозиторий загружает таблицу Table.
Connection String берется из App.config.

2) Далее создаем класс TreeNode который будет оберткой вокруг DataRow, отображающий плоскую таблицу в виде дерева:
Кликните здесь для просмотра всего текста
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
47
48
49
50
    class TreeNode : IEnumerable<TreeNode>
    {
        public DataRow Row { get; set; }
        readonly DataTable table;
        readonly string parentIdFieldName;
        readonly string idFieldName;
        readonly string showFieldName;
 
        public TreeNode(DataTable table, DataRow row, string parentIdFieldName, string idFieldName = "Id", string showFieldName = "Title")
        {
            this.table = table;
            this.parentIdFieldName = parentIdFieldName;
            this.idFieldName = idFieldName;
            this.showFieldName = showFieldName;
            this.Row = row;
        }
 
        public IEnumerator<TreeNode> GetEnumerator()
        {
            if(Row == null)
                return table.Rows.Cast<DataRow>().Where(r => r[parentIdFieldName] == DBNull.Value).Select(r => new TreeNode(table, r, parentIdFieldName, idFieldName, showFieldName)).GetEnumerator();
 
            var id = (int)Row[idFieldName];
            return table.Rows.Cast<DataRow>().Where(r => r[parentIdFieldName].Equals(id)).Select(r => new TreeNode(table, r, parentIdFieldName, idFieldName, showFieldName)).GetEnumerator();
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
 
        public override bool Equals(object obj)
        {
            var other = obj as TreeNode;
            if (other == null) return false;
            if (Row == other.Row) return true;
            return Row[idFieldName] == other.Row[idFieldName];
        }
 
        public override int GetHashCode()
        {
            if (Row == null) return 0;
            return (int)Row["Id"];
        }
 
        public override string ToString()
        {
            return Row == null ? "root" : Row[showFieldName].ToString();
        }
    }


3) Затем, используя FastTree, будем отображать дерево в главной форме:
Кликните здесь для просмотра всего текста
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
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
 
            //load db
            Repository.LoadDataSet();
 
            //build tree
            ftMain.Build(new TreeNode(Repository.DataSet.Tables["Table"], null, "ParentId"));
        }
 
        private void ftMain_DoubleClick(object sender, EventArgs e)
        {
            var node = ftMain.SelectedNode as TreeNode;
            if (node != null)
            {
                //create edit form
                var form = new InputForm() {MdiParent = this};
                //after form closed - rebuild myself
                form.FormClosed += (o, O) =>
                {
                    if (form.DialogResult == DialogResult.OK)
                        Build();
                };
                //build edit form
                form.Build(node.Row);
                //show edit form
                form.Show();
            }
        }
 
        private void Build()
        {
            ftMain.Rebuild();
        }
    }


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
47
48
49
50
51
52
53
54
    public partial class InputForm : Form
    {
        //данные
        public DataRow Row { get; private set; }
 
        public InputForm()
        {
            InitializeComponent();
        }
 
        public void Build(DataRow row)
        {
            Row = row;
 
            //создаем FieldPanel для каждого поля, отображаем в pnMain
            foreach (DataColumn col in row.Table.Columns)
            {
                var pn = new FieldPanel() {Parent = pnMain, Name = col.ColumnName};
                pn.lbName.Text = col.ColumnName;
                pn.tbField.Text = row[col.ColumnName].ToString();
            }
        }
 
        //парсинг и проверка на правильность
        private void UpdateValue()
        {
            //перебираем FieldPanel, заносим значения в DataRow
            foreach (DataColumn col in Row.Table.Columns)
            {
                var pn = (FieldPanel) pnMain.Controls[col.ColumnName];
                Row[col.ColumnName] = pn.tbField.Text;
            }
        }
 
        private void btOk_Click(object sender, EventArgs e)
        {
            try
            {
                UpdateValue();//парсинг и проверка на правильность
                DialogResult = DialogResult.OK;//выход из формы, если все введено правильно
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);//выводим сообщение об ошибке и не закрываем форму
            }
        }
 
        private void btCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;//выход из формы
            Close();
        }
    }


Результат:
Вложения
Тип файла: zip WindowsFormsApplication370.zip (175.6 Кб, 14 просмотров)
3
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
07.06.2017, 12:39  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Модель данных. Сделаем простейший репозиторий, загружающий БД в DataSet:
Спасибо! Сейчас посмотрю.
0
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
07.06.2017, 12:49
Или так:
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
            foreach (DataRow dtTableRow in dtTable.Rows)
            {
                TreeNode myTreeNode = new TreeNode
                {
                    Text = dtTableRow["title"].ToString(),
                    Name = dtTableRow["id"].ToString(),
                    Tag = dtTableRow["parentID"].ToString()
                };
 
                // вариант 1: работа с указателем на ноду
                TreeNode rooTreeNode = treeView1.Nodes.Find(myTreeNode.Tag.ToString(), true).FirstOrDefault();
                // вариант 2: работа с индексом ноды
                // int rooTreeNode2 = treeView1.Nodes.IndexOfKey(myTreeNode.Tag.ToString());
                if (rooTreeNode == null)
                {
                    treeView1.Nodes.Add(myTreeNode);
                }
                else
                {
                    // вариант 1
                    rooTreeNode.Nodes.Add(myTreeNode);
                    // вариант 2
                    // treeView1.Nodes[rooTreeNode2].Nodes.Add(myTreeNode);
                }
            }
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
07.06.2017, 18:14  [ТС]
Всем спасибо!
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.06.2017, 19:16
Несмотря на то, что автор топика выбрал вариант из поста #6, я хотел бы дать некоторые пояснения для тех, кто будет читать эту ветку позже. Вариант кода, приведенный HF (пост #8) также является рабочим. Он выгладит проще и поэтому я хотел бы пояснить чем мой вариант #6 лучше (хотя и выглядит немного сложнее).

Концептуальная разница в подходах поста #6 и #8 заключается в том, что в #6 строится модель дерева, а в #8 - модели дерева нет. Оба варианта опираются на DataTable как источник данных. Однако, поскольку структура данных древовидная, то для обработки данных (а она же тоже нужна, помимо того, что бы просто отобразить дерево) нужна также древовидная модель. Поэтому я строю обертку TreeNode, которая содержит DataRow, но при этом, с TreeNode можно работать как с деревом - каждый TreeNode содержит своих детей, дети содержат своих детей и так далее. Таким образом мы можем работать с нашими данными как с деревом. Вариант #8 нацелен только на отображение, и работать с данными как с деревом он не позволяет (вариант использования TreeView как источник данных - не рассматриваем, как несерьезный).

Кроме основного различия, есть еще технические различия:

1) Вариант #8 предполагает, что вершина-предок в таблице всегда расположен ДО вершины-потомка. Таким образом, если таблицу отсортировать например по полю Title, то вариант #8 перестает работать. Вариант #6 работает в любом случае, независимо от последовательности строк в таблице.

2) Вариант #8 опирается на фиксированные поля: Id, parentId, title. Вариант же #6 может работать с произвольными таблицами и именами полей. Имена необходимых полей и сама таблица - передается в конструктор корневого объекта TreeNode.

3) Вариант #8 имеет сложность построения дерева O(n^2) (перебираются все строки из DataRow и для каждой из них снова перебираются все вершины для поиска предка). Вариант же #6 имеет сложность O(n) поскольку не перебирает все вершины для поиска предка, а строит дерево лениво - по мере открытия вершин пользователем. Таким образом, если у нас в таблице миллион значений, то вариант #8 становится неработоспособным, потому что сложность построения дерева будет порядка 10^12 операций. Вариант же #6 построит дерево без проблем (10^6 операций).

4) Вариант #8 использует стандартный TreeNode который является довольно тяжелым контролом: медленным и жрущим много памяти. В противовес, вариант #6 использует контрол FastTree который работает исключительно в виртуальном режиме и следовательно не потребляет дополнительной памяти. Кроме того, он заточен под большие объемы данных.

5) Допустим, наше дерево поменялось - например мы изменили поле parentId одной из вершин. Для того, чтобы отобразить измененное дерево, вариант #8 требует полной перестройки - очистки TreeView и построения всех вершин заново (а это занимает O(n^2), как мы помним). Вариант же #6 работает в виртуальном режиме и перестройка не требуется, изменения будут отображены автоматически.

6) Модель дерева построенная в #6 может применяться в нескольких контролах, на нескольких формах. Вариант же #8 работает только для одного TreeView. Если нужно отобразить дерево на другой форме - нужно будет строить дерево заново.
2
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
07.06.2017, 19:42
Вроде и не обидно, но хочется ответить
Вариант #8 строился на задаче - 1) новичок программист; 2) есть таблица (3 колонки); 3) требуется построить TreeView.
- Вариант #6 настолько большой, что мне пришлось несколько раз его пробежать туда-сюда, чтобы понять что он делает и может делать. А новичок программист которому нужно чтобы работало потом ещё задаст 10 вопросов из-за того что даже не поймёт куда это всё нужно написать и почему это не работает. Т.е. ответ который тянет за собой ещё 10 вопросов. Да вы ещё и усугубили его EditForm. Да и не поймёт начинающий программист обилию продвинутого кода.
- FastTree, что не стандартный контрол. Если ТС нужно решить задачу для преподавателя, то он не будет ему сдавать с использованием сторонних библиотек.
- Ну и про универсальность #8 конечно я даже не спорю. В #6 и FastTree полно возможностей по работе с изменением источника или перемещением нод. Что уж тут сравнивать. Но! при желании, я могу тоже добавить функционала и "брюки превратятся... превратятся в элегантные шорты". И ведь это не сложно. Задачи только не стояло. Например
Цитата Сообщение от Storm23 Посмотреть сообщение
5) Допустим, наше дерево поменялось - например мы изменили поле parentId одной из вершин. Для того, чтобы отобразить измененное дерево, вариант #8 требует полной перестройки - очистки TreeView и построения всех вершин заново (а это занимает O(n^2), как мы помним). Вариант же #8 работает в виртуальном режиме и перестройка не требуется, изменения будут отображены автоматически.
На вскидку, почему нужно полностью чистить весь TreeView, если достаточно найти ноду с нужным элементом, удалить его оттуда и перенести в новую ноду. Разве это затратно? Так же и про то что использование можно сделать на любой элемент в любой фоме
Цитата Сообщение от Storm23 Посмотреть сообщение
стандартный TreeNode который является довольно тяжелым контролом: медленным и жрущим много памяти.
Пользуясь стандартными контролами, я не часто задумываюсь над тем чтобы найти "чужой" такой же контрол. Просто ради интереса - есть сравнение стандартного и FastTree? Хочется убедиться что он действительно оочень плохой.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.06.2017, 21:01
Цитата Сообщение от HF Посмотреть сообщение
Вариант #8 строился на задаче - 1) новичок программист;
Ну я же и не спорю
Я как раз и написал разъяснение, что ваш вариант тоже является рабочим. И для новичка более простым и понятным. И наверно более приемлемым. Но при построении более сложного ПО, такой вариант уже не годится, на мой взгляд.
Цитата Сообщение от HF Посмотреть сообщение
Да вы ещё и усугубили его EditForm
Я просто частично копировал код из другой темы и там уже был готовый редактор, поэтому я решил его оставить.
Цитата Сообщение от HF Посмотреть сообщение
На вскидку, почему нужно полностью чистить весь TreeView, если достаточно найти ноду с нужным элементом, удалить его оттуда и перенести в новую ноду. Разве это затратно? Так же и про то что использование можно сделать на любой элемент в любой фоме
Это действительно можно сделать, только разница в том, что вам придется
это делать И в модели И в treeview. В моем же случае - только в модели, а дерево перестроится само.
А это очень напрягает, когда нужно следить и за моделью данных и за контролами и постоянно их синхронизировать. Такой код со временем занимает большую половину всего кода вообще, тяжел в поддержке, полон багов.
Цитата Сообщение от HF Посмотреть сообщение
Пользуясь стандартными контролами, я не часто задумываюсь над тем чтобы найти "чужой" такой же контрол. Просто ради интереса - есть сравнение стандартного и FastTree? Хочется убедиться что он действительно оочень плохой.
Я давно уже не пользуюсь TreeView. Но сколько им пользовался раньше - всегда были проблемы.
Во-первых, контрол, который не поддерживает ни binding ни виртуальный режим для меня не существует. Stateful контрол это антипаттерн в чистом виде.
Во-вторых, TreeView очень тормозной. Для отображения большого дерева непригоден. Вот накатал простенький тест:
Создается дерево из миллиона вершин (на первом уровне 1000, и у каждой еще 1000 детей):
Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using FastTreeNS;
 
namespace WindowsFormsApplication372
{
    public partial class Form1 : Form
    {
        Node root;
 
        public Form1()
        {
            InitializeComponent();
 
            //строим модель (суммарно 1000000 вершин)
            Random rnd = new Random();
            root = new Node();
            for (int i = 0; i < 1000; i++)
            {
                var node = new Node() { Title = rnd.Next(100000).ToString() };
                root.Add(node);
 
                for (int j = 0; j < 1000; j++)
                    node.Add(new Node() { Title = rnd.Next(100000).ToString() });
            }
        }
 
        private void btBuild_Click(object sender, EventArgs e)
        {
            //строим FastTree, засекаем время
            var sw = Stopwatch.StartNew();
            BuildFastTree(root, ftMain);
            sw.Stop();
            lbFastTreeTime.Text = "Time: " + sw.Elapsed;
 
            //строим TreeView, засекаем время
            sw = Stopwatch.StartNew();
            BuildTreeView(root, tvMain.Nodes);
            sw.Stop();
            lbTreeViewTime.Text = "Time: " + sw.Elapsed;
        }
 
        private void BuildTreeView(Node root, TreeNodeCollection nodes)
        {
            foreach (var node in root)
            {
                var tn = new TreeNode {Text = node.Title};
                nodes.Add(tn);
                BuildTreeView(node, tn.Nodes);
            }
        }
 
        private void BuildFastTree(Node root, FastTree fastTree)
        {
            fastTree.Build(root);
            fastTree.Refresh();
        }
    }
 
    class Node : List<Node>
    {
        public string Title { get;set;}
 
        public override string ToString()
        {
            return Title;
        }
    }
}




TreeView отображает это 22 секунды, а FastTree - 19 миллисекунд! Разница на три порядка.
При чем чем больше размер дерева, тем дольше TreeView будет его строить. А скорость построения FastTree не очень сильно зависит от размера дерева.
Кроме того, если посмотреть на расход памяти, то FastTree практически не использует память (как и любой контрол в виртуальном режиме), а TreeView подгребает под себя 300 МБ памяти!

Помимо этого, TreeView содержит много неудобств: не поддерживает мультиселект, не поддерживает стили каждой вершины по отдельности (цвет, размер, бекграунд и т.д.), не поддерживает drag&drop вершин в нормальном виде, теряет визуальное выделение при потере фокуса, не имеет события при потере выделения вершины. Все это есть в FastTree.
Вложения
Тип файла: zip Compare_test.zip (517.9 Кб, 2 просмотров)
2
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
07.06.2017, 21:07
Цитата Сообщение от Storm23 Посмотреть сообщение
Во-первых ...
Спасибо, гляну конечно.
Я по большей части в ASP и WPF. Здесь для опыта задачи решаю.
А что по поводу WPF? Там то уж точно должен быть нормальный контрол.
0
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
08.06.2017, 12:46  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Несмотря на то, что автор топика выбрал вариант из поста #6...
Тем не менее, спасибо, всё получилось . Минут за 20 разобрался. Имхо, до этого кодил на ++, потому, немного понимаю архитектуру.
И да, это не задача для преподавателя, а попытка собственной разработки. Осталось только понять принцип добавления новых нодов, как головных, так и дочерних.

Добавлено через 38 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
FastTree
Может и глупый вопрос, но существуют ли у FastTree NodeLines ? Дерево как-то голо смотрится...

Добавлено через 8 минут
скачан FastTree был, соответственно, отсюда
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.06.2017, 12:46
Цитата Сообщение от GuardianCoder Посмотреть сообщение
но существуют ли у FastTree NodeLines ? Дерево как-то голо смотрится...
NodeLines нынче не в моде (собственно уже лет 10 как). Посмотрите проводник виндовый, посмотрите дерево солюшена в VisualStudio - нигде нет линий.
В FastTree линий тоже нет.
1
2 / 2 / 2
Регистрация: 02.06.2017
Сообщений: 63
08.06.2017, 12:48  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
NodeLines нынче не в моде
Значит, будем использовать ShowIcons
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2017, 12:48
Помогаю со студенческими работами здесь

Редактирование значений в TreeView
Доброго дня! На форме TreeView и текстовое поле. Есть следующий код, который показывает текстовое поле в TreeView, вводишь в него...

Передача значений между 2-мя Treeview
Подскажите пожалуйста как по нажатию кнопки, перенести узел с одного TreeView в другой, например как на рисунку child c TreeView1 перенести...

Выборка значений value
Добрый день. Задача, по клику на кнопку очистить значения всех value в списке инпутов в форме. Делаю так: ...

Выборка значений
есть таблицы откуда я хочу получить значения при помощи: select (replace(name, 'edu.com','') + ' ,' + 'coname'+ ',' + 'poname') as...

Выборка значений
есть такие таблицы справочники: ИдТовара Товар ТипТовара ИдТипТовара ТипТовара Заполняем: ТочкаПродажи ТипТовара Товар Количество ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru