Помогите ,плиз, c TreeView
От: 2_amigos Россия  
Дата: 25.09.06 07:46
Оценка:
Следующая проблема:
Хочу взять из таблицы Department(IdDepartment-иден.номер отдела,Name-название отдела,IdHeadDept-иден.номер главного отдела) названия отделов и иерархическом порядке выдать в TreeView.
Получилось что-то(смотри код ниже),но понимаю что так нельзя и что нужно использовать что-то другое!!!
Подскажите,плиз,как нужно это сделать нормально!!!

DataTable dtDepartments = new DataTable();
SqlDataAdapter dataSql = new SqlDataAdapter("Select * from Department", connSql);
dataSql.Fill(dtDepartments);

BeginUpdate();
Nodes.Clear();

foreach (DataRow drDepartment in dtDepartments.Rows)
            {
                if ((int)drDepartment["IdDepartment"] >= 0)
                {
                    if ((int)drDepartment["IdHeadDept"]==0)
                    {
                        if ((int)drDepartment["IdDepartment"] == (int)drDepartment["IdHeadDept"])
                        {

                            TreeNode tnDept = new TreeNode();
                            tnDept.Text = drDepartment["Name"].ToString();
                            tnDept.Tag = drDepartment;
                            Nodes.Add(tnDept);
                        }
                        else
                        {
                            TreeNode tnSubDept = new TreeNode();
                            tnSubDept.Text = drDepartment["Name"].ToString();
                            tnSubDept.Tag = drDepartment.ItemArray;
                            Nodes[0].Nodes.Add(tnSubDept);
                        }
                    }

                }
Re: Помогите ,плиз, c TreeView
От: 2_amigos Россия  
Дата: 25.09.06 08:08
Оценка:
Здравствуйте, 2_amigos, Вы писали:

_>Следующая проблема:

_>Хочу взять из таблицы Department(IdDepartment-иден.номер отдела,Name-название отдела,IdHeadDept-иден.номер главного отдела) названия отделов и иерархическом порядке выдать в TreeView.
_>Получилось что-то(смотри код ниже),но понимаю что так нельзя и что нужно использовать что-то другое!!!
_>Подскажите,плиз,как нужно это сделать нормально!!!

_>
_>DataTable dtDepartments = new DataTable();
_>SqlDataAdapter dataSql = new SqlDataAdapter("Select * from Department", connSql);
_>dataSql.Fill(dtDepartments);

_>BeginUpdate();
_>Nodes.Clear();

_>foreach (DataRow drDepartment in dtDepartments.Rows)
_>            {
_>                if ((int)drDepartment["IdDepartment"] >= 0)
_>                {
_>                    if ((int)drDepartment["IdHeadDept"]==0)
_>                    {
_>                        if ((int)drDepartment["IdDepartment"] == (int)drDepartment["IdHeadDept"])
_>                        {

_>                            TreeNode tnDept = new TreeNode();
_>                            tnDept.Text = drDepartment["Name"].ToString();
_>                            tnDept.Tag = drDepartment;
_>                            Nodes.Add(tnDept);
_>                        }
_>                        else
_>                        {
_>                            TreeNode tnSubDept = new TreeNode();
_>                            tnSubDept.Text = drDepartment["Name"].ToString();
_>                            tnSubDept.Tag = drDepartment.ItemArray;
_>                            Nodes[0].Nodes.Add(tnSubDept);
_>                        }
_>                    }

_>                }
_>
RE: Помогите ,плиз, c TreeView
От: Аноним  
Дата: 25.09.06 08:14
Оценка:
Следующая проблема:
Хочу взять из таблицы Department(IdDepartment-иден.номер отдела,Name-название отдела,IdHeadDept-иден.номер главного отдела) названия отделов и иерархическом порядке выдать в TreeView.
Получилось что-то, но понимаю что так нельзя и что нужно использовать что-то другое!!!
Подскажите,плиз,как нужно это сделать нормально!!!


Можно использовать рекурсивную функцию для заполнения всего дерева, если это нужно.

Но лучше, ИМХО, написать функцию для заполнения одной ветки FillBranch(TreeNode,idHeadDept), в которой нужно выбрать из БД все отделы, входящие в состав IdHeadDept и заполнить переданный TreeNode.

И повесить эту функцию в обработчике события NreeNodeExpand — ну на раскрытие ветки.

При этом нужно в процедуре FillBranch(TreeNode,idHeadDept) добавлять в каждый новый созданный Node пустую ветку, для того, чтобы она могла открываться. Или, что езще лучше в процедуру выборки из БД отделов, входящих в idHeadDept добавить поле, в котором возвращать количество подразделений в этом отделе и если оно больше 0, то добавлять новую ветку.



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Помогите ,плиз, c TreeView
От: 2_amigos Россия  
Дата: 25.09.06 08:17
Оценка:
Здравствуйте, 2_amigos, Вы писали:
Re[2]: Помогите ,плиз, c TreeView
От: 2_amigos Россия  
Дата: 25.09.06 10:24
Оценка:
Здравствуйте, Chai_nik!, Вы писали:

C_>Можно использовать рекурсивную функцию для заполнения всего дерева, если это нужно.


C_>Но лучше, ИМХО, написать функцию для заполнения одной ветки FillBranch(TreeNode,idHeadDept), в которой нужно выбрать из БД все отделы, входящие в состав IdHeadDept и заполнить переданный TreeNode.


Есть ли еще варианты для реализации?
RE: Re[2]: Помогите ,плиз, c TreeView
От: Аноним  
Дата: 25.09.06 10:39
Оценка:
Есть ли еще варианты для реализации?

А чем эти варианты не подошли?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Помогите ,плиз, c TreeView
От: 2_amigos Россия  
Дата: 25.09.06 10:58
Оценка:
Здравствуйте, Chai_nik!, Вы писали:


C_>Есть ли еще варианты для реализации?


C_>А чем эти варианты не подошли?


C_>
данное сообщение получено с www.gotdotnet.ru

C_>ссылка на оригинальное сообщение


Получилось следующее, но это мне кажется не универсальный вариант. Здесь я не стал выносить отдельную функцию
FillBranch(TreeNode,idHeadDept)

public class DepartmentTreeView : TreeView
    {
        public DepartmentTreeView()
        {
            SqlConnection connSql = new SqlConnection();

            DataTable dtDepartments = new DataTable();
            SqlDataAdapter dataSql = new SqlDataAdapter("Select * from Department", connSql);
            dataSql.Fill(dtDepartments);

            BeginUpdate();
            Nodes.Clear();

            foreach (DataRow drDepartment in dtDepartments.Rows)
            {
                if ((int)drDepartment["IdDepartment"] >= 0)
                {
                    if ((int)drDepartment["IdDepartment"] == (int)drDepartment["IdHeadDept"])
                    {
                        TreeNode tnDept = new TreeNode();
                        tnDept.Text = drDepartment["Name"].ToString();
                        tnDept.Tag = drDepartment;
                        Nodes.Add(tnDept);

                        foreach (DataRow drSubDepartment in dtDepartments.Rows)
                        {
                            if ((int)drSubDepartment["IdDepartment"] >= 0)
                            {
                                if ((int)drSubDepartment["IdHeadDept"] == (int)drDepartment["IdDepartment"])
                                {

                                    TreeNode tnSubDept = new TreeNode();
                                    tnSubDept.Text = drSubDepartment["Name"].ToString();
                                    tnDept.Nodes.Add(tnSubDept);
                                }
                            }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.