Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение TreeView / 25 сообщений из 26, страница 1 из 2
23.04.2008, 15:24
    #35274575
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Приветик, Всем!!!
Знаю, что эта тема обсуждалась и не один раз, но все равно не получается написать небольшой код заполнения дерева из таблицы БД...
Я стянула на форму элемент TreeView, а дальше пытаюсь заполнить его, вот код...
Код: plaintext
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.
private void NodeAdder(string id_tipGSM, TreeNode tn2Add)
        {
            // Создадим условие, при котором рекурсия будет прервана
            // Она должна прерваться, если у записи нет подчинённых записей
            // Вот мы их и посчитаем
            int counter = 0;
            foreach (DataRow drow in autoTransportDataSet.TreeTipGSM.Rows)
            {
                if (drow["parent_id"].ToString() == id_tipGSM)
                {
                    counter++;
                }
            }
            if (counter == 0)
            {
                return;
            }

            // Теперь прицем детей к родительской ветки
            // Если детей нет, то мы вышли шагом раньше
            foreach (DataRow drow in autoTransportDataSet.TreeTipGSM.Rows)
            {
                if (drow["parent_id"].ToString() == id_tipGSM)
                {
                    TreeNode tnGSM = new TreeNode(drow["NameTipGSM"].ToString().Trim());
                    NodeAdder(drow["id_tipGSM"].ToString(), tnGSM);
                    /* Объект, прицепляемый к родительским веткам*/
                    TagInfoGSM  tinfoGSM = new TagInfoGSM();
                    tinfoGSM.id_tipGSM = Convert.ToInt32(drow["id_tipGSM"]);
                    tinfoGSM.parent_id = Convert.ToInt32(drow["parent_id"]);
                    tinfoGSM.NameTipGSM = (string)drow["NameTipGSM"];
                    tinfoGSM.plotnostGSM = (string) drow["PlotnostGSM"];
                    tnGSM.Tag = tinfoGSM;
                    /*---*/
                    tn2Add.Nodes.Add(tnGSM);
                    treeView1.Refresh();

                }
            }
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (((TagInfoGSM)e.Node.Tag).parent_id != 0)
            {
                treeTipGSMBindingSource.Filter = "id_tipGSM = " + ((TagInfoGSM)e.Node.Tag).id_tipGSM;
            }
            else
            {
                treeTipGSMBindingSource.Filter = "";
            }
            
            id_tipGSMTextBox.Refresh();
            parent_idTextBox.Refresh();
            nameTipGSMTextBox.Refresh();
            plotnostGSMTextBox.Refresh();

        }
Плюс ко всему, я хочу что бы выбранная ветка в дереве могла редактироваться в этой же форме в TextBox... но почему-то не получается ни заполнить дерево, ни отобразить выбранную ветку в текстовом поле... Хотя это рабочий код, я его использовала на другой форме для заполнения...
Надеюсь на Вашу помочь...
...
Рейтинг: 0 / 0
24.04.2008, 15:36
    #35277647
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Все тут хорошо работает, просто забыла про заполнение при загрузке формы...
...
Рейтинг: 0 / 0
26.04.2008, 09:10
    #35281293
Алекандр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Помогите пожалуйста...

у меня есть табличка со связью сама на себя... получается что-то типа бесконечных папок...
так вот как это дело загрузить в TreeView из базы.. ни чего не получается :(
...
Рейтинг: 0 / 0
28.04.2008, 13:08
    #35283334
rdfg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
рекурсия поможет
...
Рейтинг: 0 / 0
15.10.2008, 14:50
    #35595908
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Помогите правильно заполнить treeview, если таблица имеет следующий вид:
id,
parent_1,
parent_2,
item_name
а код заподнения использую самый верхний
...
Рейтинг: 0 / 0
15.10.2008, 15:57
    #35596183
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
По образу и подобию.

Код: plaintext
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.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
private void button_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    BindingSource bindingSource = new BindingSource();
    bindingSource.DataSource = dt;

    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Value", typeof(string));
    dt.Columns.Add("Parent_Id", typeof(int));

    dt.Rows.Add(1, "value1", 0);
    dt.Rows.Add(2, "value2", 0);
    dt.Rows.Add(3, "value3", 0);
    dt.Rows.Add(4, "value4", 1);
    dt.Rows.Add(5, "value5", 1);
    dt.Rows.Add(6, "value6", 1);
    dt.Rows.Add(7, "value7", 2);
    dt.Rows.Add(8, "value8", 3);
    dt.Rows.Add(9, "value9", 3);
    dt.Rows.Add(10, "value10", 7);

    // 1 способ - с рекурсией (красивее)
    FillTreeView(treeView1, dt);

    // 2 способ - без рекурсии (чуточку шустрее)
    FillTreeView2(treeView1, bindingSource);

}

// ***************** 1 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="dt"></param>
private void FillTreeView(TreeView treeView, DataTable dt)
{
    treeView.Nodes.Clear();
    DataRow[] rows = dt.Select("Parent_Id = 0");
    foreach (DataRow row in rows)
    {
        TreeNode node = new TreeNode(row["Value"].ToString());
        node.Tag = row["Id"];
        treeView.Nodes.Add(node);
        FillNode(node, dt);
    }
}

/// <summary>
///  Добавление к ноде чилдов
/// </summary>
/// <param name="parentNode"></param>
/// <param name="dt"></param>
private void FillNode(TreeNode parentNode, DataTable dt)
{
    DataRow[] rows = dt.Select(string.Format("Parent_Id = {0}", parentNode.Tag));
    foreach (DataRow row in rows)
    {
        TreeNode treeNode = new TreeNode(row["Value"].ToString());
        treeNode.Tag = row["Id"];
        parentNode.Nodes.Add(treeNode);
        FillNode(treeNode, dt);
    }
}

// **************************************************************************************




// ***************** 2 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="bindingSource"></param>

private void FillTreeView2(TreeView treeView, BindingSource bindingSource)
{
    treeView.Nodes.Clear();
    bindingSource.Position = 0;
    for (int i = 0; i < bindingSource.Count; i++)
    {
        //Application.DoEvents();
        DataRow dr = (bindingSource.Current as DataRowView).Row;

        int id = Convert.ToInt32(dr["id"]);
        int parent_id = Convert.ToInt32(dr["parent_id"]);
        string name = dr["value"].ToString();

        if (parent_id == 0)
            treeView.Nodes.Add(FillNode(id, name));
        else
        {
            TreeNode[] treeNodes = treeView.Nodes.Find(parent_id.ToString(), true);
            if (treeNodes.Length != 0)
                (treeNodes.GetValue(0) as TreeNode).Nodes.Add(FillNode(id, name));
        }
        bindingSource.MoveNext();
    }
}

/// <summary>
/// Создание новой ноды
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns>TreeNode</returns>
private TreeNode FillNode(int id, string name)
{
    TreeNode treeNode = new TreeNode();
    treeNode.Tag = id;
    treeNode.Name = id.ToString();
    treeNode.Text = name;
    return treeNode;
}

// **************************************************************************************
...
Рейтинг: 0 / 0
07.11.2008, 13:49
    #35640046
St17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
такой вопрос. кода много в теме. не разобрался. я пробую заполнить данными из бд. ток чет не совсем получаеться. подскажите как правильно заполнить.
...
Рейтинг: 0 / 0
07.11.2008, 13:51
    #35640056
St17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
хотяб одну ветку родитель 1 и дети2
...
Рейтинг: 0 / 0
07.11.2008, 14:00
    #35640092
zz
zz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Товарищи, объясните, зачем по тысяче раз задавать вопросы, ответы на которых находятся:

а) поиском по форуму
б) в специализированной литературе
в) в MSDN?

Что за привычка: чуть что не получается - сразу постить на форум? Я смотрю последние темы и просто тихо фигею: как открыть форму, как закрыть форму, как считать данные с базы, как отсортировать ComboBox...
Скоро будут спрашивать, как открыть Visual Studio и что дальше с ней сделать, чтоб получилось круто.

Примеров по заполнению TreeView - полно. Открывайте и разбирайтесь.

Извините, накипело.
...
Рейтинг: 0 / 0
07.11.2008, 14:38
    #35640208
St17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
я вехде ишю . прочитал все статьи. написалже не пойму. сижу на мсдн. тут пока глухо. англиский плохо знаю долго перевожу. вот и попросил пример. былбы учебник не спрашивал бы
...
Рейтинг: 0 / 0
07.11.2008, 14:40
    #35640219
St17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
вот такой я халявщик не хочу нече делать. дайте мне код. сижу уже 3 часа без перерыва изучаю.
...
Рейтинг: 0 / 0
07.11.2008, 14:46
    #35640236
St17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
сори.
...
Рейтинг: 0 / 0
15.04.2009, 17:13
    #35934156
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Есть две таблицы связанные между собой, одна - родитель, а вторая - дочь... хочу построить дерево, которое будет отображать в главных узлах родителя и соответственно им дочь...
Структура таблицы родителя - id, name... Структура дочки - id, name, idparent
Только не пинать...
...
Рейтинг: 0 / 0
15.04.2009, 17:59
    #35934298
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
LinelТолько не пинать...
а какие еще варианты есть?
...
Рейтинг: 0 / 0
15.04.2009, 18:08
    #35934319
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Варианты есть разные... дерево у меня получается, как выше написано, немного подправила и все ОК!!! а когда две таблицы - проблема...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
foreach (DataRow dr1 in table1)
{
   treeview1.Nodes.Add(new TreeNode(dr1["Name"]));

   foreach (DataRow dr2 in table2)
 {
    if (dr2["parent_id"].ToString()==dr1["id"].ToString())
   {
      //Вот тут и не получается
   }
 }

}
...
Рейтинг: 0 / 0
15.04.2009, 18:13
    #35934330
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
foreach (DataRow dr1 in table1)
{
TreeNode node = new TreeNode(dr1["Name"]);
   treeview1.Nodes.Add(node);

   foreach (DataRow dr2 in table2)
 {
    if (dr2["parent_id"].ToString()==dr1["id"].ToString())
   {
     node.Add(new TreeNode(dr2["Name"]);
   }
 }

}
я вот думаю - это весеннее отупление?
...
Рейтинг: 0 / 0
15.04.2009, 18:14
    #35934335
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
наверное конец рабочего дня
...
Рейтинг: 0 / 0
15.04.2009, 18:16
    #35934337
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Linelнаверное конец рабочего дня
кстате - ваш код далек от оптимального. лень править. весеннее обленение...
...
Рейтинг: 0 / 0
15.04.2009, 18:21
    #35934348
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
но Ваш тоже не работает
...
Рейтинг: 0 / 0
15.04.2009, 18:33
    #35934374
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
а я и не говорил, что будет работать :))
и ваще, тетя, не компилируется и не работает - разные вещи.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
foreach (DataRow dr1 in table1.Rows)
            {
            TreeNode node = new TreeNode(dr1["Name"].ToString());
               treeview1.Nodes.Add(node);

               foreach (DataRow dr2 in table2.Rows)
             {
                if (dr2["parent_id"].ToString()==dr1["id"].ToString())
               {
                 node.Nodes.Add(new TreeNode(dr2["Name"].ToString()));
               }
             }

            }
...
Рейтинг: 0 / 0
15.04.2009, 18:34
    #35934376
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
winsky!Linelнаверное конец рабочего дня
кстате - ваш код далек от оптимального. лень править. весеннее обленение...
немного "поколдовала" и заработал...
...
Рейтинг: 0 / 0
15.04.2009, 18:43
    #35934397
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
есть предложение - в цикле, который внутре (вложенный), бегать не по всей таблице а по отфильтрованному набору (по parent_id)
...
Рейтинг: 0 / 0
17.04.2009, 10:14
    #35937849
Linel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
а если попробовать оформить это красиво через рекурсию... вот пример кода, но в нем есть ошибка с переполнением... Подскажите как исправить
Код: plaintext
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.
public class TagInfoTipTS
        {
            public int id_TipTSMain;
            public string NameTipTSMain;

            public int id_TipTS;
            public string NameTipTS;
            public int id_parentMain;

        }

// ... при загрузке формы заполняем дерево

            #region заполняем дерево
            TagInfoTipTS tinfoTS;
            treeView1.BeginUpdate();
            foreach (DataRow drow in autoTransportDataSet.TipTSMain.Rows)
            {
               
                    TreeNode tn = new TreeNode(drow["NameTipTSMain"].ToString().Trim());
                    tinfoTS = new TagInfoTipTS();
                    tinfoTS.id_TipTSMain = Convert.ToInt32(drow["id_TipTSMain"]);
                    tinfoTS.NameTipTSMain = (string)drow["NameTipTSMain"];
                    tn.Tag = tinfoTS;
                    /*---*/
                    NodeAdder(drow["id_TipTSMain"].ToString(), tn);
                    treeView1.Nodes.Add(tn);
                
            }
            treeView1.EndUpdate();
            #endregion



private void NodeAdder(string id, TreeNode tn2Add)
        {
             int counter = 0;
            foreach (DataRow drow in autoTransportDataSet.TipTS.Rows)
            {
                if (drow["id_TipTSMain"].ToString() == id)
                {
                    counter++;
                }
            }
            if (counter == 0)
            {
                return;
            }

            foreach (DataRow drow in autoTransportDataSet.TipTS.Rows)
            {
                if (drow["id_TipTSMain"].ToString() == id)
                {
                    TreeNode tn = new TreeNode(drow["NameTipTS"].ToString().Trim());
                    NodeAdder(drow["id_TipTSMain"].ToString(), tn);
                    TagInfoTipTS tinfoTipTS = new TagInfoTipTS();
                    tinfoTipTS.id_TipTS = Convert.ToInt32(drow["id_TipTS"]);
                    tinfoTipTS.NameTipTS = (string)drow["NameTipTS"];
                    tinfoTipTS.id_parentMain = Convert.ToInt32(drow["id_TipTsMain"]);
                    tn.Tag = tinfoTipTS;
                    /*---*/
                    tn2Add.Nodes.Add(tn);

                }
            }
        }
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.06.2017, 15:54
    #39468800
WertAndrey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
private void button_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    BindingSource bindingSource = new BindingSource();
    bindingSource.DataSource = dt;

    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Value", typeof(string));
    dt.Columns.Add("Parent_Id", typeof(int));

    dt.Rows.Add(1, "value1", 0);
    dt.Rows.Add(2, "value2", 0);
    dt.Rows.Add(3, "value3", 0);
    dt.Rows.Add(4, "value4", 1);
    dt.Rows.Add(5, "value5", 1);
    dt.Rows.Add(6, "value6", 1);
    dt.Rows.Add(7, "value7", 2);
    dt.Rows.Add(8, "value8", 3);
    dt.Rows.Add(9, "value9", 3);
    dt.Rows.Add(10, "value10", 7);

    // 1 способ - с рекурсией (красивее)
    FillTreeView(treeView1, dt);

    // 2 способ - без рекурсии (чуточку шустрее)
    FillTreeView2(treeView1, bindingSource);

}

// ***************** 1 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="dt"></param>
private void FillTreeView(TreeView treeView, DataTable dt)
{
    treeView.Nodes.Clear();
    DataRow[] rows = dt.Select("Parent_Id = 0");
    foreach (DataRow row in rows)
    {
        TreeNode node = new TreeNode(row["Value"].ToString());
        node.Tag = row["Id"];
        treeView.Nodes.Add(node);
        FillNode(node, dt);
    }
}

/// <summary>
///  Добавление к ноде чилдов
/// </summary>
/// <param name="parentNode"></param>
/// <param name="dt"></param>
private void FillNode(TreeNode parentNode, DataTable dt)
{
    DataRow[] rows = dt.Select(string.Format("Parent_Id = {0}", parentNode.Tag));
    foreach (DataRow row in rows)
    {
        TreeNode treeNode = new TreeNode(row["Value"].ToString());
        treeNode.Tag = row["Id"];
        parentNode.Nodes.Add(treeNode);
        FillNode(treeNode, dt);
    }
}

// **************************************************************************************




// ***************** 2 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="bindingSource"></param>

private void FillTreeView2(TreeView treeView, BindingSource bindingSource)
{
    treeView.Nodes.Clear();
    bindingSource.Position = 0;
    for (int i = 0; i < bindingSource.Count; i++)
    {
        //Application.DoEvents();
        DataRow dr = (bindingSource.Current as DataRowView).Row;

        int id = Convert.ToInt32(dr["id"]);
        int parent_id = Convert.ToInt32(dr["parent_id"]);
        string name = dr["value"].ToString();

        if (parent_id == 0)
            treeView.Nodes.Add(FillNode(id, name));
        else
        {
            TreeNode[] treeNodes = treeView.Nodes.Find(parent_id.ToString(), true);
            if (treeNodes.Length != 0)
                (treeNodes.GetValue(0) as TreeNode).Nodes.Add(FillNode(id, name));
        }
        bindingSource.MoveNext();
    }
}

/// <summary>
/// Создание новой ноды
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns>TreeNode</returns>
private TreeNode FillNode(int id, string name)
{
    TreeNode treeNode = new TreeNode();
    treeNode.Tag = id;
    treeNode.Name = id.ToString();
    treeNode.Text = name;
    return treeNode;
}

// **************************************************************************************
...
Рейтинг: 0 / 0
08.06.2017, 16:03
    #39468815
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение TreeView
Ты 8 лет осмысливал код?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Заполнение TreeView / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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