cómo enlazar controles ASP.NET mediante un auto unirse y artículos tablas “jerárquicamente estructura”?

StackOverflow https://stackoverflow.com/questions/703613

Pregunta

Tengo las siguientes tablas:
1-Categorías:
-CategoryID
-CategoryName
-ParentID

2-Items:
-ItemId
-ItemName
-CategoryID

Las categorías se pueden ver en una forma jerárquica, con muchas categorías de niños dentro de la otra.
Y cualquier categoría de la última niño puede tener los elementos, por lo que sólo la categoría último hijo mostrará objetos debajo de ella.
La vista será como una vista de árbol y cuando se hace clic en un elemento que va a ir a una nueva página.

Lo escribí como esto:

<asp:Repeater runat="server" ID="rptCategories" OnItemDataBound="rptCategories_ItemDataBound" >
    <ItemTemplate>
        <div id="type_<%# Eval("Type") %>">
            <p >
                <a id="<%# Eval("CategoryID") %>" class="Categories">
                    <%# Eval("CategoryName") %></a>
            </p>
            <div id="ProjectsDiv_<%# Eval("CategoryID") %>" class="Projects">

                <asp:Repeater ID="rptProjects" runat="server">
                    <ItemTemplate>
                        <a id="<%# Eval("ProjectID") %>" class="ProjectLink">
                        <%# GetProject(Eval("ProjectID"))%>

                        </a>
                    </ItemTemplate>
                </asp:Repeater>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>


pero esto representa una estructura de una sola planta,
Mi pregunta es cómo hacer que sea como una vista de árbol?

¿Fue útil?

Solución

Esto va a ser complicado con un repetidor si usted no sabe dónde llega la jerarquía. ¿Por qué no sólo tiene que utilizar un TreeView asp.net?

  

http://msdn.microsoft .com / es-es / library / system.web.ui.webcontrols.treeview.aspx

Puede utilizar ajax asp.net y un UpdatePanel para lograr el efecto deseado sin necesidad de escribir Javascript a sí mismo.

Otros consejos

Para ello, tiene dos clases -. Uno para un control de árbol, y el otro que se alimenta de los datos para el control en una jerarquía

  • Para el control, sólo podría utilizar algo así como un TreeView , o usted podría escribir su propia heredando de HierarchalDataBoundControl .

  • Para la fuente de datos, ya que tiene un formato muy específico y personalizado de sus datos, tiene que escribir una clase que implementa IHierarchalDataSource. Esa clase se convertirá en la fuente de datos de su control, y cuando se llama a DataBind, que va a alimentar al control de los datos de una manera jerárquica.

Aquí está una tutorial sobre cómo construir un HierarchalDataBoundControl desde cero.

Otra opción es usar la recursividad y ser rápido y sucio al respecto. Le contesté una pregunta relacionada en este aquí .

if (! IsPostBack)             {                 Rellenar (TreeView1.Nodes);

        }
    }

  protected  void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        TreeNode node = TreeView1.SelectedNode;
        string nodeId = node.Value;
        string nodeName = node.Text;

    }
    private void Populate(TreeNodeCollection nodes)
    {
        TreeNode parentNode = null;
        foreach (Category1 category in GetProductCategories())
        {
            parentNode = new TreeNode(category.Name, category.Id.ToString());
            if (category.Subcategories != null)
            {
                SubNodes(category, parentNode);
            }
            parentNode.Collapse();
            TreeView1.Nodes.Add(parentNode);
        }
    }
    private void SubNodes(Category1 category, TreeNode childNode)
    {
        foreach (Category1 c1 in category.Subcategories)
        {
            TreeNode subchildnode = new TreeNode(c1.Name, c1.Id.ToString());
            childNode.ChildNodes.Add(subchildnode);
            if (c1.Subcategories != null)
            {
                SubNodes(c1, subchildnode);
            }
        }
    }
    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
    }
    #region unwanted

    // Show all checkboxes

    //TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
    //protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    //{
    //    PopulateSubLevel(Int32.Parse(e.Node.Value), e.Node);
    //}
    //private void PopulateSubLevel(int parentid, TreeNode parentnode)
    //{
    //    Populate1( parentid,parentnode.ChildNodes);
    //}
    //private void Populate1(int k1,TreeNodeCollection nodes)
    //{
    //    foreach (var j in GetProductCategories())
    //    {
    //        if (j.ParentId == k1)
    //        {
    //            foreach (var k in j.Subcategories)
    //            {

    //                TreeNode tn = new TreeNode();
    //                tn.Text = k.Name;
    //                tn.Value = k.ParentId.ToString();
    //                nodes.Add(tn);
    //                //tn.PopulateOnDemand = ((int)(k.Subcategories.Count) > 0);

    //            }
    //           // break;
    //        }

    //    }
    //}
    #endregion
    #region class
    //public List<Category1> GetProductCategories()
    //{
    //    return new List<Category1> { 
    //        new Category1{Id=1,Name="Power Tools",ParentId=0,Sequence=1,Description="Power Tools",DisplayInHeader=true, 
    //            Subcategories = new List<Category1>
    //                {new Category1{Id=100,Name="Drills",ParentId=1,Sequence=1,Description="Drills",DisplayInHeader=true},
    //                new Category1{Id=101,Name="Drill Accessories",ParentId=1,Sequence=1,Description="Drill Accessories",DisplayInHeader=true},
    //                new Category1{Id=102,Name="Saws",ParentId=0,Sequence=1,Description="Saws",DisplayInHeader=true}  
    //                }},
    //                new Category1{Id=2,Name="Cordless Tools",ParentId=1,Sequence=1,Description="Cordless Tools",DisplayInHeader=true, 
    //            Subcategories = new List<Category1>
    //                {new Category1{Id=200,Name="Batteries/Chargers",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true} 

    //                }},new Category1{Id=3,Name="AirTools",ParentId=2,Sequence=1,Description="Air Tools",DisplayInHeader=true, 
    //            Subcategories = new List<Category1>
    //                {new Category1{Id=300,Name="Portable Compressors",ParentId=0,Sequence=1,Description="Portable Compressors",DisplayInHeader=true},

    //                }}
    //    };
    //}
    #endregion

    public List<Category1> GetProductCategories()
    {
        return new List<Category1> { 
            new Category1{Id=1,Name="Power Tools",ParentId=0,Sequence=1,Description="Power Tools",DisplayInHeader=true, 
                Subcategories = new List<Category1>
                    {new Category1{Id=100,Name="Drills",ParentId=1,Sequence=1,Description="Drills",DisplayInHeader=true},
                    new Category1{Id=101,Name="Drill Accessories",ParentId=1,Sequence=1,Description="Drill Accessories",DisplayInHeader=true,
                        Subcategories= new List<Category1>{new Category1{Id=1001,Name="Drill Accessories",ParentId=101,Sequence=1,Description="Drill Accessories",DisplayInHeader=true,
                        Subcategories= new List<Category1>{new Category1{Id=1001,Name="Drill Accessories",ParentId=101,Sequence=1,Description="Drill Accessories",DisplayInHeader=true}}}}},                              

                    new Category1{Id=102,Name="Saws",ParentId=0,Sequence=1,Description="Saws",DisplayInHeader=true}  
                    }},
                    new Category1{Id=2,Name="Cordless Tools",ParentId=1,Sequence=1,Description="Cordless Tools",DisplayInHeader=true, 
                Subcategories = new List<Category1>
                    {new Category1{Id=200,Name="Batteries/Chargers",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true,
                    Subcategories = new List<Category1>
                    {new Category1{Id=200,Name="Batteries",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true,
                    Subcategories = new List<Category1>
                    {new Category1{Id=200,Name="Batteries",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true,
                    Subcategories = new List<Category1>
                    {new Category1{Id=200,Name="Batteries",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true,
                    Subcategories = new List<Category1>
                    {new Category1{Id=200,Name="Batteries",ParentId=2,Sequence=1,Description="Batteries/Chargers",DisplayInHeader=true}}}}}}}}} 

                    }},new Category1{Id=3,Name="AirTools",ParentId=2,Sequence=1,Description="Air Tools",DisplayInHeader=true, 
                Subcategories = new List<Category1>
                    {new Category1{Id=300,Name="Portable Compressors",ParentId=0,Sequence=1,Description="Portable Compressors",DisplayInHeader=true},

                    }},


        };
    }

Oracle tenía una sentencia CONNECT A que fue diseñado para consultas jerárquicas. Al menos como de SQL Server 2005 no creo que había un equivalente directo por lo que tuvo que fingir con procedimientos almacenados ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top