powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как циклом пройтись по treeView?
8 сообщений из 8, страница 1 из 1
Как циклом пройтись по treeView?
    #39626011
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть TreeView (картинка)
в каждую node записываю что то типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
node.Tag = " AND YEAR(dataOut) =@year";//Parent.Parent
node.Name = "@year";
node.Text= "2018";
соответственно
node1.Tag = " AND MONTH(dataOut) =@month";//Parent
node1.Name = "@month";
node1.Text= "январь";
итд


Сижу и никак не соображу как пройтись циклом по родительским узлам, чтобы добавить их в запрос с параметрами
Не хочется колхозить титаническую конструкцию с огромным количеством if, хотелось бы что то типа:
Код: c#
1.
for(int i=0;i<treeView1.SelectedNode.Level .....



Если по картинке, то тут надо добавить три параметра 273, январь, 2018
(соответственно количество параметров при разных кликах всегда разное, от 1 до 7)

с текущим узлом понятно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
Param = new SqlParameter(treeView1.SelectedNode.Name, SqlDbType.NChar);
Param.Value = treeView1.SelectedNode.Text;
node.Tag добавляется в запрос

дальше

январь -treeView1.SelectedNode.Parent.Text
2018-treeView1.SelectedNode.Parent.Parent.Text


т.е. кол-во .Parent всегда разное и как это описать в цикле?
хотел через это попробовать
Код: c#
1.
treeView1.Nodes[0].Nodes[8].Nodes[0].Text


но тоже кол-во .Nodes разное

FindNode не подходит. Он ищет по name. А у меня все node на каждом уровне получаются с одинаковым именем

Я где то туплю или надо совершенно по другому подходить?
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626043
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял, вам нужно подняться по дереву к корневому элементу.
Если наоборот, то тогда лучше делать рекурсивно, если рекурсивность не очень большая
делать примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
var currentElement = SelectedElement;
var result = string.empty;
while (currentElement  != null)
{
      result  += currentElement.Text;
      currentElement  = currentElement.Parent;
}


Как только текущий элемент станет Null, это значит у него больше нет родителей.
Если строка большая, то лучше использовать StringBuilder, он будет работать быстрее и жрать меньше памяти
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626074
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesКак я понял, вам нужно подняться по дереву к корневому элементу.

Именно это и нужно. Можно и наоборот, не принципиально

только у меня почему то он не переходит на уровень выше
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 var currentElement =treeView1.SelectedNode;
            var result = "";
            while (currentElement != null)
            {
                
                result += currentElement.Text;
                currentElement = treeView1.SelectedNode.Parent;
                MessageBox.Show(result);
            }            


у меня бесконечно добавляет только родительский, т.е 273 январь январь январь январь
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626082
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
затупил
Код: c#
1.
 currentElement  = currentElement.Parent;




Спасибо за пример. Все работает
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626083
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не сложно, то можно еще пример с:Roman MejtesЕсли строка большая, то лучше использовать StringBuilder, он будет работать быстрее и жрать меньше памяти
Тоже интересно
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626308
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var currentElement = treeView1.SelectedNode;
var result = new StringBuilder();
while (currentElement != null)
{

    result.Append(currentElement.Text);
    currentElement = currentElement.Parent;
}
MessageBox.Show(result.ToString());


Суть в том, что строка в C# это иммутейбл (imutable) класс. Иммутейбл означает, что состояние объекта невозможно изменить, можно только создать новый класс с новым состоянием. Проще говоря
объявив переменну
string A = "Value1",
а затем объединив её с другой строкой
A += "AddText", вы создаете 3 объекта: "Value1", "AddText" и "Value1AddText", в случае с StringBuilder, этого не происходит, так как он просто сохраняет все строковые переменным в список (цепочку) и после того как вы вызываете ToString() объединяет их. Это сильно экономит ресурсы процессора и памяти, потому как при каждой конкатинации строк, ему не нужно создавать новый результат.
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626314
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. использовать его нужно только если таких объединений много и они происходят в цикле, если нужно канкатинировать 2 строки использовать stringbuilder для этого не нужно, эффект будет обратным
...
Рейтинг: 0 / 0
Как циклом пройтись по treeView?
    #39626483
mdm114
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как циклом пройтись по treeView?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]