2011-12-13 2 views
0

У меня есть следующая структура таблицы, это может быть некорректная структура, но, к сожалению, это то, что мне дали.Treeview с родительским/дочерним вызовом по статусу

id | Name | Parent | Status 
1 First  0  Active 
2 Child  1  Active 
3 2Child 2  Inactive 

Логика:

  1. Load Root Материнской = 0 и состояния

  2. OnPopulate ребенка нагрузки родительским ID и статус для каждого уровня после корня

    мой вопрос, если статус «Неактивен», и я хочу посмотреть, какие параметры неактивны, я не могу, потому что первые 2 варианта активны. Мне нужно, чтобы иметь возможность просматривать в моем древовидной структуре все уровни до опции, которая неактивна или активна.

Я попытался следующей SQL Statement

select distinct 
     m.Id, 
     m.Name, 
     m.Parent, 
     m.[Status] 
from mytable m 
where m.Parent = 3 and m.[Status] = 'I' 
union 
select 
     Id, 
     Name, 
     Parent, 
     [Status] 
from mytable 
where ID in(select distinct 
     o.ID 
from mytable o 
where o.ID = 3 and o.[Status] = 'I') and Parent = 3 

Я выбежала из идей в SQL и кодирование, чтобы понять это out..hope кто-то может направить меня в нужном direction..thanks

попытался Также это в коде:

protected void mytree_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
    { 
     //this is just a class that loads the values from db 
     MYList templist = new ListSyFamily(); 
     templist.LoadAll();//(ddlStatus.SelectedValue, Convert.ToInt32(e.Node.Value)); 

     foreach (temp temp in templist) 
     { 
      if (temp.Status == ddlStatus.SelectedValue && temp.Parent == Convert.ToInt32(e.Node.Value)) 
      { 
       TreeNode child = new TreeNode(); 
       child.Text = temp.Description; 
       child.Value = temp.Id.ToString(); 
       if (child.ChildNodes.Count == 0) 
        child.PopulateOnDemand = true; 

       child.ToolTip = "Ver sub-opciones"; 
       //child.SelectAction = TreeNodeSelectAction.SelectExpand; 

       child.CollapseAll(); 

       e.Node.ChildNodes.Add(child); 
      } 
     } 
    } 
+0

Является ли это запрос к базе данных MySQL? –

+0

no this is MS Sql – Andres

ответ

2

Вот как мы справляемся с этим.

Предположим, что у вас есть класс с именем MyRecord держать каждую строку данных из БД:

public class MyRecord 
{ 
    public int Id {get; set; } 
    public int ParentId {get; set; } 

    public string Name { get; set; } 
    public string Status { get; set; } 

    // The children of this node 
    public MyRecordCollection Children = new MyRecordCollection(); 
} 

Тогда у вас есть тип коллекции для хранения этих записей, индексированных по их ID:

public class MyRecordCollection : System.Collections.Generic.Dictionary<int, MyRecord> 
{ 

} 

Вот код (извлечение из БД не показан) для предварительной обработки записей, а затем их добавления к дереву:

 MyRecordCollection cAllRecords; 
     MyRecordCollection cParentRecords = new MyRecordCollection(); 

     // This is a method that just loads the records 
     cAllRecords = LoadAllRecords(); 

     // Cycle through each of the records 
     foreach (MyRecord oRecord in cAllRecords.Values) 
     { 
      if (oRecord.Id == 0) 
      { 
       // If the record is a parent record, add it to the list of parents 
       cParentRecords.Add(oRecord.Id, oRecord); 
      } 
      else 
      { 
       // Otherwise, add the current record to its parent's list of children 
       cAllRecords[oRecord.ParentId].Children.Add(oRecord.Id, oRecord); 
      } 
     } 

     AddNodesToTree(cParentRecords, this.treeView1.Nodes); 

И, наконец, рекурсивный метод для добавления записи в дерево:

/// <summary> 
    /// A recursive method to add all of the records to the specified collection of nodes 
    /// </summary> 
    /// <param name="cRecords"></param> 
    /// <param name="cNodes"></param> 
    private void AddNodesToTree(MyRecordCollection cRecords, TreeNodeCollection cNodes) 
    { 
     foreach (MyRecord oRecord in cRecords.Values) 
     { 
      TreeNode oNode = new TreeNode(); 
      oNode.Text = oRecord.Name; 
      oNode.Tag = oRecord; 
      cNodes.Add(oNode); 
      // Now add the node's children if any 
      if (oRecord.Children.Count != 0) 
      { 
       AddNodesToTree(oRecord.Children, oNode.Nodes); 
      } 
     } 

    } 
+0

Спасибо! У меня был кто-то, кто помог мне, и он придумал одно и то же решение, немного отличающееся, но только то же самое. Так рада за таких людей, как ты и этот отличный сайт! :) – Andres

+0

+1 хорошо объяснено – Pleun

1

Ну, если бы я был тобой, я бы просто загрузить всю таблицу в память в простую коллекцию легкого класса DTO и выработайте свое дерево в C#. Это кажется намного проще, чем попробовать множество вариантов в SQL.

+0

, если быть честным с тобой, я настолько тупой, что понятия не имею, что ты предлагаешь .. это похоже на хорошее решение, но я не могу придумать это. Я отредактирую свой вопрос до покажите, что я пробовал до сих пор. – Andres

Смежные вопросы