Следующая проблема:
Хочу взять из таблицы 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);
}
}
}
Здравствуйте, 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);
_> }
_> }
_> }
_>
Следующая проблема:
Хочу взять из таблицы Department(IdDepartment-иден.номер отдела,Name-название отдела,IdHeadDept-иден.номер главного отдела) названия отделов и иерархическом порядке выдать в TreeView.
Получилось что-то, но понимаю что так нельзя и что нужно использовать что-то другое!!!
Подскажите,плиз,как нужно это сделать нормально!!!
Можно использовать рекурсивную функцию для заполнения всего дерева, если это нужно.
Но лучше, ИМХО, написать функцию для заполнения одной ветки FillBranch(TreeNode,idHeadDept), в которой нужно выбрать из БД все отделы, входящие в состав IdHeadDept и заполнить переданный TreeNode.
И повесить эту функцию в обработчике события NreeNodeExpand — ну на раскрытие ветки.
При этом нужно в процедуре FillBranch(TreeNode,idHeadDept) добавлять в каждый новый созданный Node пустую ветку, для того, чтобы она могла открываться. Или, что езще лучше в процедуру выборки из БД отделов, входящих в idHeadDept добавить поле, в котором возвращать количество подразделений в этом отделе и если оно больше 0, то добавлять новую ветку.
Здравствуйте, Chai_nik!, Вы писали:
C_>Можно использовать рекурсивную функцию для заполнения всего дерева, если это нужно.
C_>Но лучше, ИМХО, написать функцию для заполнения одной ветки FillBranch(TreeNode,idHeadDept), в которой нужно выбрать из БД все отделы, входящие в состав IdHeadDept и заполнить переданный TreeNode.
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);
}
}