如何结合asp.net 控制使用的自我加入和项目表"分层结构"?
-
22-08-2019 - |
题
我有以下表:
1类:
-类别id
-类别名称
-ParentID
2-项目:
-ItemId
-ItemName
-类别id
分类可以在一个层次看,有很多孩子类别内。
和任何最后一个子类别可以有项目,所以只有最后一个类别的孩子将展示的项目下。
查看会像树视图和当击一个项目,它将会去到一个新的一页。
我写它是这样的:
<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 /库/ system.web.ui.webcontrols.treeview.aspx
您可以使用asp.net Ajax和一个UpdatePanel达到你想要的效果,而无需编写任何JavaScript自己。
其他提示
要做到这一点,你需要两类--一个用于树控制,和其他饲料的数据以控制在一个层次结构。
为控制,可能只使用东西就像一个 树视图, 或者你可以写你自己通过继承 HierarchalDataBoundControl.
对数据来源,因为你有一个非常具体和定制格式的数据,需要编写一个类实现 IHierarchalDataSource.这类会成为数据源的控制,并且当你呼叫据绑定,它将料的控制的数据在一个分层次的方式。
这里是一个教程 在如何建立一个HierarchalDataBoundControl从头开始。
另一个选择是只是利用递归,并迅速和肮脏的。我回答一个相关的问题上这个 在这里,.
如果(!的IsPostBack) { 填充(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},
}},
};
}
甲骨文不得不说是专为分层查询一个CONNECT BY语句。至少在SQL Server 2005中,我不相信有一个直接等同,所以你不得不伪造它使用存储过程...