자체 조인 및 항목 테이블“계층 구조”를 사용하여 ASP.NET 컨트롤을 바인딩하는 방법은 무엇입니까?
-
22-08-2019 - |
문제
다음 테이블이 있습니다.
1- 범주 :
-CategoryID
-카테고리 이름
-PARENTID
2- 항목 :
-itemid
-상품명
-CategoryID
카테고리는 계층 적으로 볼 수 있으며 많은 어린이 카테고리가 서로 내부에 있습니다.
그리고 마지막 어린이 카테고리에는 항목이있을 수 있으므로 마지막 카테고리 자녀만이 그 아래에 항목을 보여줄 것입니다.
보기는 TreeView와 같으며 항목을 클릭하면 새 페이지로 이동합니다.
나는 이것을 다음과 같이 썼다 :
<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>
그러나 이것은 한 레벨 구조를 나타냅니다.
내 질문은 그것을 나무로 만드는 방법입니다.
해결책
계층 구조가 얼마나 깊게 진행되는지 모르면 이것은 리피터로 복잡 할 것입니다. ASP.NET TreeView를 사용하지 않는 이유는 무엇입니까?
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview.aspx
asp.net ajax와 updatepanel을 사용하여 JavaScript를 직접 작성하지 않고 원하는 효과를 달성 할 수 있습니다.
다른 팁
이를 위해서는 두 개의 클래스가 필요합니다. 하나는 트리와 같은 제어 용이고 다른 하나는 계층 구조에서 데이터를 제어에 공급하는 두 가지 클래스가 필요합니다.
컨트롤을 위해 트리 뷰, 또는 당신은 Hierarchaldataboundcontrol.
데이터 소스의 경우 매우 구체적이고 사용자 정의 데이터 형식이 있으므로 구현하는 클래스를 작성해야합니다. iHierarchaldatasource. 해당 클래스는 귀하의 컨트롤의 데이터 소스가되며 Databind를 호출하면 데이터가 계층 적 방식으로 데이터를 공급합니다.
다음은 튜토리얼입니다 처음부터 계층 적 알타 바운드 컨트롤을 구축하는 방법에 대해.
또 다른 옵션은 재귀를 사용하고 그것에 대해 빠르고 더 많은 것입니다. 나는 이것에 대한 관련 질문에 대답했다 여기.
if (! ispostback) {populate (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은 계층 적 쿼리를 위해 설계된 명령문별로 연결했습니다. 적어도 SQL Server 2005에서 나는 직접 동등한 것이 있다고 생각하지 않아서 저장된 절차로 가짜를 가짜로 생각하지 않았다 ...