Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Отображение в TreeView MySQL данных


Автор: Дарвин 12.2.2009, 14:01
Есть задача отображения в TreeView данных из MySQL. Да возможно некоторые скажут, что аналоги были и т.д., но сколько я бы не мучался, не могу добиться нужного результата.

Таблица выглядит следующим образом:

id | name | parent_id 

Суть вывод из этой таблицы, да так, чтоб он читал parent_id и в нужное место в TreeView вставлял.

Вот здесь немного кода, что я сам додумался, но почему то на моменте TreeNode nNode = ((TreeNode)Nodes[lvl]); выскакивает ошибка.

http://slil.ru/26636746


Очень прошу помощи - от этого зависит возьмут на работу или нет. Спасибо.

Автор: Bogdan1024 12.2.2009, 14:27
Мог бы код и здесь привести, там нечего качать.
Какая ошибка вываливается?

Автор: Дарвин 12.2.2009, 17:09
Что там есть:
Код

public void AddChildren(TreeNode parent_node, int parent_id)
        {
            MySqlCommand command = null;
            if (parent_id == -1)
                command = new MySqlCommand("SELECT * FROM tree WHERE parent_id = 0 ORDER BY id", conn);
            else
                command = new MySqlCommand("SELECT * FROM tree WHERE parent_id = " + parent_id.ToString() + " ORDER BY id", conn);

            MySqlDataReader reader = command.ExecuteReader();
            List<TreeNode> nodes = new List<TreeNode>();
            while (reader.Read())
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = reader["name"].ToString();
                newNode.Tag = reader["id"];
                nodes.Add(newNode);
            }
            reader.Close();

            foreach (TreeNode node in nodes)
            {
                AddChildren(node, Convert.ToInt32(node.Tag));
            }

            if (parent_node == null)
                this.treeView1.Nodes.AddRange(nodes.ToArray());
            else
                parent_node.Nodes.Add(nodes.ToArray().ToString());
        }

        public void TreeListView()
        {
            AddChildren(null, -1);
        }


Собственно не выводит ошибку, но почему то зацикливается.

Вот БД:
Код

CREATE TABLE `tree` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `parent_id` int(11) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


INSERT INTO `tree` VALUES (0,'Каталог',0);
INSERT INTO `tree` VALUES (1,'Радел1',0);
INSERT INTO `tree` VALUES (2,'Радел2',0);
INSERT INTO `tree` VALUES (3,'Объект',2);




Автор: Partizan 12.2.2009, 17:59
Дарвин

INSERT INTO `tree` VALUES (0,'Каталог',0);

тут косяк...

Автор: Дарвин 13.2.2009, 10:57
Цитата

INSERT INTO `tree` VALUES (0,'Каталог',0);

тут косяк... 


В чём именно? 

Автор: Partizan 13.2.2009, 11:08
Дарвин, зацикливание...элемент не может быть собственным родителем...

Код

INSERT INTO `tree` VALUES (1,'Каталог',0);
INSERT INTO `tree` VALUES (2,'Радел1',1);
INSERT INTO `tree` VALUES (3,'Радел2',1);
INSERT INTO `tree` VALUES (4,'Объект',2);

Автор: Дарвин 13.2.2009, 12:25
Итак спасибо Partizan'у всё получилось. Вот представляю вам готовое решение. Может кому будет полезно.
Код

public void AddChildren(TreeNode parent_node, int parent_id)
        {
            MySqlCommand command = null;
            if (parent_id == -1)
                command = new MySqlCommand("SELECT * FROM tree WHERE parent_id = 0 ORDER BY id", conn);
            else
                command = new MySqlCommand("SELECT * FROM tree WHERE parent_id = " + parent_id.ToString() + " ORDER BY id", conn);

            MySqlDataReader reader = command.ExecuteReader();
            List<TreeNode> nodes = new List<TreeNode>();
            while (reader.Read())
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = reader["name"].ToString();
                newNode.Tag = reader["id"];
                nodes.Add(newNode);
            }
            reader.Close();

            foreach (TreeNode node in nodes)
            {
                AddChildren(node, Convert.ToInt32(node.Tag));
            }

            if (parent_node == null)
                this.treeView1.Nodes.AddRange(nodes.ToArray());
            else
                parent_node.Nodes.AddRange(nodes.ToArray());
        }

        public void TreeListView()
        {
            AddChildren(null, -1);
        }


И SQL
Код

CREATE TABLE `tree` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `parent_id` int(11) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `tree` VALUES ('1', 'Каталог', '0');
INSERT INTO `tree` VALUES ('2', 'Раздел1', '1');
INSERT INTO `tree` VALUES ('3', 'Раздел2', '1');
INSERT INTO `tree` VALUES ('4', 'Объект1', '3');
INSERT INTO `tree` VALUES ('5', 'Объект2', '3');
INSERT INTO `tree` VALUES ('6', 'Подобъект', '5');


Всем спасибо.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)