Заполнение TreeView

Нинка
Дата: 15.05.2006 20:48:54
Помогите, люди добрые!
Понимаю, что тема уже многократно обсуждалась, но ничего для меня понятного я пока не нашла.
Исходные данные:
1.C# 2005
2.MS SQL 2000
3.Талица вида id, name, parentid (ссылается на эту же таблицу на поле id)

Надо:
При загрузке формы (Windows Form) заполнить дерево из имеющейся таблицы желательно, даже обязательно используя DataSet и иже с ними.

Буду крайне признательна!
С приветом, Нинка:)
ak1
Дата: 16.05.2006 11:30:50
http://www.gotdotnet.ru/LearnDotNet/ASPNET/672.aspx
для ASP.NET страницы

либо тут посмотри
http://www.gotdotnet.ru/Search_Search.aspx?search=%f0%e0%e1%ee%f2%e0+%f1+TreeView
yooo
Дата: 16.05.2006 13:50:21
private void tree_expand(System.Windows.Forms.TreeNode node)
        {
            //Переменная ветка дерева
            System.Windows.Forms.TreeNode node1;

            //Переменные БД
            conPDA = new SqlConnection(FormMain.STRConnection);
            SqlCommand sqlGetOstatki = new SqlCommand("Sel_Tree", conPDA);
            sqlGetOstatki.CommandType = CommandType.StoredProcedure;
            sqlGetOstatki.Parameters.Add("@parent_id", SqlDbType.Char, 9);
            //если переданная в процедуру ветка нулевая то id первого уровня
            if (node == null)
                sqlGetOstatki.Parameters[0].Value = "     0   ";
            else
            {
                //Иначе - родительской ветки
                sqlGetOstatki.Parameters[0].Value = node.Tag.ToString();
                node.Nodes.Clear();
            }
            //Чтение данных из БД
            System.Data.SqlClient.SqlDataReader DataReader;
            try
            {
                conPDA.Open();
                DataReader = sqlGetOstatki.ExecuteReader();
                treeViewNom.BeginUpdate();

                //если ветка корневая - добавляем ноды в корень
                if (node == null)
                {
                    while (DataReader.Read())
                    {
                        treeViewNom.Nodes.Add(node = new TreeNode(DataReader.GetString(1)));
                        node.Tag = DataReader.GetString(0);
                        if (DataReader.GetInt32(2) == 1)
                        {
                            node.ImageIndex = 0;
                            node.SelectedImageIndex = 0;
                            node.Nodes.Add(new TreeNode(null));
                        }

                        else
                        {
                            node.ImageIndex = 1;
                            node.SelectedImageIndex = 1;
                        }
                    }
                }
                else
                {
                    //если не корневая - добавляем ноды к существующей ноде
                    while (DataReader.Read())
                    {
                        node.Nodes.Add(node1 = new TreeNode(DataReader.GetString(1)));
                        node1.Tag = DataReader.GetString(0);
                        if (DataReader.GetInt32(2) == 1)
                        {
                            node1.ImageIndex = 0;
                            node1.SelectedImageIndex = 0;
                            node1.Nodes.Add(new TreeNode(null));
                        }

                        else
                        {
                            node1.ImageIndex = 1;
                            node1.SelectedImageIndex = 1;
                        }
                    }
                }
                treeViewNom.EndUpdate();
                DataReader.Close();
                sqlGetOstatki.Dispose();
                conPDA.Close();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message, "Ошибка работы с БД:");
            }
            conPDA.Dispose();
yooo
Дата: 16.05.2006 13:56:29
То есть при открытии формы вызываешь процедуру с параметром null
При раскрытии ветки:
//Раскрытие ветки
        private void treeViewNom_AfterExpand(object sender, TreeViewEventArgs e)
        {
            tree_expand(e.Node);
        }
При закрытии ветки
//Закрытие ветки
        private void treeViewNom_AfterCollapse(object sender, TreeViewEventArgs e)
        {
            //Очистка дочерних нод
            e.Node.Nodes.Clear();
            e.Node.Nodes.Add(new TreeNode(null));
        }
Нинка
Дата: 17.05.2006 07:55:20
Спасибо за ответ! Большое спасибо!
Я так поняла, что у вас есть хитрая процедура, которая что -то выбирает, видиом предков по родительскому иду....
Меня смущают два момента:
1.А если все-таки заполнять из таблицы минуя процедуру
2.Как можно обойтись без ДатаРидера? Ну не знаю я что это такое и зачем оно нужно....:( .... Есть у меня DataSEt, который будет содержать таблицу вот его бы как-нибудь и прикрутить к TreeView....
Эхх..Простите мне мою чайниковость....
yooo
Дата: 17.05.2006 08:27:01
Если ты выбираешь в датасет из БД, а только потом вставляешь его в в дерево то датаридером будет однозначно быстрее. Почитай в справке что это такое.

Все это работает и без хранимых процедур:
SqlCommand sqlGetOstatki = new SqlCommand("SELECT dbo.Nomencl.ID, dbo.Nomencl.Descript,  dbo.Nomencl.Is_Folder
FROM  dbo.Nomencl where Nomencl.Parent_ID = @parent_id
ORDER BY Nomencl.Is_Folder, Nomencl. descript", conPDA);

Но если приспичило из датсета:

using ds = (твой_dataset as datatable)
{
for (int i; i<= ds.rows.count - 1; i++)
{
 ds.row[i][j] - вот тебе ссылка на конкретную ячейку датасета
в цикле обходишь вск строки и заполняешь дерево - см. выше
}
}
Super_p
Дата: 17.05.2006 18:22:21
Нинка, не смотри на етого програмиста с тяжолой рукой(всмысле, он очень сложно все написал)!!!!! Я тебе сегодня или завтра скину нормальной маленький код считивания в TreeView из DataSet. Ето моя курсовая работа по ООР))))
Super_p
Дата: 17.05.2006 18:23:30
Нинка, не смотри на етого програмиста с тяжолой рукой(всмысле, он очень сложно все написал)!!!!! Я тебе сегодня или завтра скину нормальной маленький код считивания в TreeView из DataSet. Ето моя курсовая работа по ООР))))
Нинка
Дата: 18.05.2006 07:29:26
Спасибо за помощь господину yooo:)
И буду крайне признательна господину Super_p если вы действительно поделитесь со мной этим кодом:)
Спасть не могу из-за этого TreeView ... из-за этого нехорошего контрола не могу толком доделать свой несчастный диплом:(
Единственное что хочеться еще раз упомянуть, что студия у меня 2005....
Как хорошо что есть на свете добрые люди:)!
UPS!!!
Дата: 18.05.2006 09:25:58
Ув. Super_p!
Можно еще одному страждущему получить Ваш код для считывания в TreeView?