powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вывод информации в TreeView
20 сообщений из 20, страница 1 из 1
Вывод информации в TreeView
    #37618984
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Возникла проблема при заполнении TreeView. TreeView вместе с корневым узлом у меня создан статически, все остальные узлы создаются динамически. При запуске страницы выводится название корневого узла(без плюсика для раскрытия), а под названием выводится весь список марок автомобилей(тоже без плюсиков). Нужно же, чтобы это происходило при раскрытии плюсика. И второе: как мне взять значение элемента марки? У меня в обработчик поступает название узла "Марки", а мне нужно значения узлов. Вот код методов :
Код: 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.
protected void Page_Load(object sender, EventArgs e)
        {           
            this.PopulateBrands();                                    
        }

        private void PopulateBrands()
        {            
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "Select brandOfCar From Brands";
            DataSet ResultSet = RunQuery(sqlQuery);

            if (ResultSet.Tables.Count > 0)
            {
                TreeNode NewNode = null;
                foreach (DataRow row in ResultSet.Tables[0].Rows)
                {
                    NewNode = new TreeNode(row["brandOfCar"].ToString());                    
                    NewNode.PopulateOnDemand = true;
                    NewNode.SelectAction = TreeNodeSelectAction.Expand;
                    TreeView1.Nodes.Add(NewNode);
                }                
            }           
        }

        private void PopulateModels(TreeNode node)
        {            
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "Select nameModel From Models where Models.brandId in (Select IdBrand where Brands.brandOfCar = @nameBrand)";
            sqlQuery.Parameters.Add("@nameBrand", SqlDbType.NVarChar).Value = node.Value;                      

            DataSet ResultSet = RunQuery(sqlQuery);
            if (ResultSet.Tables.Count > 0)
            {
                foreach (DataRow row in ResultSet.Tables[0].Rows)
                {
                    TreeNode NewNode = new TreeNode(row["nameModel"].ToString());
                    NewNode.PopulateOnDemand = false;
                    NewNode.SelectAction = TreeNodeSelectAction.Expand;
                    node.ChildNodes.Add(NewNode);
                }
            } 
        }

protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            TreeNode node = new TreeNode(TreeView1.Nodes[0].Value);
            this.PopulateModels(node);
        }
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37618992
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где код статической части, скорее всего неправильно вы итемы добавили, марки автомобилей не являются child а добавлены просто как узлы
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37618998
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавляйте все сразу динамически (рекурсивно) , заодно будете проверять есть ли у подчиненные узлы и выставлять PopulateOnDemand и если не нужно давать выбрать родителя при "живых" потомках будете упарвлять SelectAction у TreeNode
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619001
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman
Select nameModel From Models where Models.brandId in (Select IdBrand where Brands.brandOfCar = @nameBrand)"



У вас что бренды и марки в одной таблице ? и brandOfCar varchar ???
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619022
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...

NewNode = new TreeNode(row["brandOfCar"].ToString(),row["brandOfCarID"] );

...

SqlCommand sqlQuery = new SqlCommand();
sqlQuery.CommandText = "Select nameModel From Models where Models.brandId = @BrandID)";
sqlQuery.Parameters.Add("@BrandID", SqlDbType.int).Value = node.Value;


По ключу и без вложенных запросов наверное быстрее искать будет
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619042
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey1306а где код статической части, скорее всего неправильно вы итемы добавили, марки автомобилей не являются child а добавлены просто как узлы
<asp:TreeView ID="TreeView1" runat="server"
ontreenodepopulate="TreeView1_TreeNodePopulate">
<Nodes>
<asp:TreeNode PopulateOnDemand="True" Text="Марки" Value="Марки"></asp:TreeNode>
</Nodes>
</asp:TreeView>
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619046
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey1306ermanSelect nameModel From Models where Models.brandId in (Select IdBrand where Brands.brandOfCar = @nameBrand)"



У вас что бренды и марки в одной таблице ? и brandOfCar varchar ???
У меня бренды и есть марки - таблица Brands. brandOfCar типа nvarchar.
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619050
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman,

да я увидел уже, просто меня смутил вот этот синтаксис , без FROM во вложеном запросе, и что такой синтаксис без ошибок работает

"Select nameModel From Models where Models.brandId in (Select IdBrand where Brands.brandOfCar = @nameBrand)";


Вы попробуйте тут вот так сделать

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 private void PopulateBrands()
        {            
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "Select brandOfCar From Brands";
            DataSet ResultSet = RunQuery(sqlQuery);

            if (ResultSet.Tables.Count > 0)
            {
                TreeNode parent= TreeView1.Nodes[0];
                foreach (DataRow row in ResultSet.Tables[0].Rows)
                {
                    TreeNode NewNode = new TreeNode(row["brandOfCar"].ToString());        //            а тут передалать все таки на NodeValue
                    NewNode.PopulateOnDemand = true;
                    NewNode.SelectAction = TreeNodeSelectAction.Expand;
                   parent.node.add(NewNode);
                }       
                TreeView1.Nodes.Add(NewNode);         
            }           
        }
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619061
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
parent.node.add(NewNode);

У меня здесь ещё нет node - ошибка.
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619068
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman,

уберите из декларативного обьявления
Код: html
1.
2.
3.
 <Nodes>
<asp:TreeNode PopulateOnDemand="True" Text="Марки" Value="Марки"></asp:TreeNode>
</Nodes>



и тогда как то так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 private void PopulateBrands()
        {            
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "Select brandOfCar From Brands";
            DataSet ResultSet = RunQuery(sqlQuery);

            if (ResultSet.Tables.Count > 0)
            {
                TreeNode parent = new TreeNode("Марки", "Марки"); 
                foreach (DataRow row in ResultSet.Tables[0].Rows)
                {
                    TreeNode NewNode = new TreeNode(row["brandOfCar"].ToString());        //            а тут передалать все таки на NodeValue
                    NewNode.PopulateOnDemand = true;
                    NewNode.SelectAction = TreeNodeSelectAction.Expand;
                   parent.node.add(NewNode);
                }       
                TreeView1.Nodes.Add(NewNode);         
            }           
        }
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619093
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
parent.node.add(NewNode); - что такое это node у вас? Оно же должно где-то объявляться или как...
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619096
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ermanparent.node.add(NewNode); - что такое это node у вас? Оно же должно где-то объявляться или как...


parent.nodes.add(NewNode)

студии под рукою нету, могу в синтаксисе напутать. ВАм нужно к паренту присобачить все свои узлы а потом сам парент уже к контролу девевяному
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619540
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал таким образом :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TreeNode parent = TreeView1.Nodes[0];
                TreeNode NewNode;
                foreach (DataRow row in ResultSet.Tables[0].Rows)
                {
                    NewNode = new TreeNode(row["brandOfCar"].ToString()); //а тут передалать все таки на NodeValue
                    NewNode.PopulateOnDemand = true;
                    NewNode.SelectAction = TreeNodeSelectAction.Expand;
                    parent.ChildNodes.Add(NewNode);
                }
                TreeView1.Nodes.Add(parent);


Коллекции nodes нет. В результате получил исключение выхода за пределы массива. Что здесь не то?
Код: 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.
Индекс должен находиться в границах этого списка.
Имя параметра: index
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.ArgumentOutOfRangeException: Индекс должен находиться в границах этого списка.
Имя параметра: index

Ошибка источника:

Строка 50:                     parent.ChildNodes.Add(NewNode);
Строка 51:                 }
Строка 52:                 TreeView1.Nodes.Add(parent);
Строка 53:             }           
Строка 54:         }


Исходный файл: G:\AutoCatalog\TreeViewDynamic.aspx.cs    Строка: 52

Трассировка стека:

[ArgumentOutOfRangeException: Индекс должен находиться в границах этого списка.
Имя параметра: index]
   System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) +67
   System.Collections.Generic.List`1.Insert(Int32 index, T item) +28
   System.Web.UI.WebControls.TreeNodeCollection.AddAt(Int32 index, TreeNode child) +393
   System.Web.UI.WebControls.TreeNodeCollection.Add(TreeNode child) +14
   AutoCatalog.TreeView.PopulateBrands() in G:\ASP_Project\AutoCatalog51\AutoCatalog\TreeViewDynamic.aspx.cs:52
   AutoCatalog.TreeView.Page_Load(Object sender, EventArgs e) in G:\ASP_Project\AutoCatalog51\AutoCatalog\TreeViewDynamic.aspx.cs:16
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +46
   System.Web.UI.Control.OnLoad(EventArgs e) +83
   System.Web.UI.Control.LoadRecursive() +120
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3954
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37619577
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TreeNode parent = new TreeNode("Марки", "Марки");

вместо

TreeNode parent = TreeView1.Nodes[0];

Вы же ноды удалили из aspx , откуда им там взятся ?
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620101
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, это заработало.
Может ещё подскажете как заполнить узлы, которые удалось вывести? Нужно писать событие динамически или как, писать делегат?
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620153
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ermanСпасибо, это заработало.
Может ещё подскажете как заполнить узлы, которые удалось вывести? Нужно писать событие динамически или как, писать делегат?

Не понят вопрос !

Как в узел добавить данные при развороте его ?
Так все было сделано у Вас

Код: c#
1.
2.
3.
4.
5.
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            TreeNode node = new TreeNode(TreeView1.Nodes[0].Value);
            this.PopulateModels(node);
        }
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620384
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
TreeNode node = new TreeNode(TreeView1.Nodes[0].Value);
            this.PopulateModels(node);



Выделенный код возвращает не название марки авто, а слово "Марки" и по этому слову происходит поиск в БД и соответственно ничего не выводится. Нужно вернуть значения подузлов "Марки". Как это сделать?
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620409
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erman,
Nodes[0].Value вообще то , я бы использовал для айди, а не для текста. и искал по нему. Так было бы правильно.

а искать ну как-то так


foreach (TreeNode child in TreeView1.Nodes[0] /*Узел относительного которого ищем*/ )
{
// child используем
и если сильно ветвление то рукурсивно обраьывать дальше

}
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620514
erman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как взять Id динамически созданного узла? Разве у него есть Id?
...
Рейтинг: 0 / 0
Вывод информации в TreeView
    #37620600
Andrey1306
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey1306...

NewNode = new TreeNode(row["brandOfCar"].ToString(),row["brandOfCarID"] ); /*А это для чего !!!!!!!!!!!!!!!!!*/

...

SqlCommand sqlQuery = new SqlCommand();
sqlQuery.CommandText = "Select nameModel From Models where Models.brandId = @BrandID)";
sqlQuery.Parameters.Add("@BrandID", SqlDbType.int).Value = node.Value;


По ключу и без вложенных запросов наверное быстрее искать будет
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Вывод информации в TreeView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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