Hej, Okej, postar koden... Jag har löst det :D ...men vill fortfarande gärna ha tips om hur jag får bort rootNoden... Hej !TreeView - hur öka antalet nivåer (depth)?
Mysko rubrik kanske, men vad ska man säga?
Det är så att jag har plockat exemplet för hur man skapar en TreeView som är kopplad till en databas från ASP.NET Quickstart Tutorials (http://quickstarts.asp.net/QuickStartv20/util/srcview.aspx?path=~/aspnet/samples/ctrlref/navigation/TreeView/TreeView11.src).
Jag har anpassat den efter mina behov och den fungerar klockrent! (nästan)
Men jag har två problem:
1. Hur får jag bort rootNoden?
Vet att den måste finnas där, men har för mig att jag sett att det går att dölja den, minns bara inte hur..
2. Hur får jag den att gå djupare ner i strukturen? (se exempelkoden ovan så förstår ni kanske hur det ser ut, annars postar jag min kod)
Det är så att jag skapar en TreeView som i princip är en navigeringsmeny.
Förutsättningar:
- Jag har en tabell i databasen som heter TblPages, i den finns bland annat fälten PageID, PageTitle och PageParentID.
- Om PageParentID = 0 så blir det den första nivån, poster där PageParentID är någonting annat (icke nullerbart) är barn till någon av dessa, och "ärver" förälderns PageID i PageParentID fältet.
- Så långt fungerar koden, men om jag skapar ett barn till ett av barnen får den ett PageParentID som inte tillhör nivå ett, utan nivå 2, detta visas inte...
Jag är så srtukturerad och logisk i min beskrivning så ni förstår givetvis vad jag menar ;) men postar ett exempel för säkerhets skull:
Tabellen i databasen:
(PageID | PageTitle | PageParentID)
1 | Sida1 | 0
2 | Sida2 | 0
3 | Sida3 | 1
4 | Sida4 | 2
5 | Sida5 | 3
...ska bli (har inte med rootNoden):
Sida1
- Sida3
- - Sida5
Sida2
- Sida4
...men jag får bara ut (har fortfarande inte med rootNoden):
Sida1
- Sida3
Sida2
- Sida4
Som jag har löst det kallar jag på nivå1 noderna genom en Procedur som kallar alla poster där PageParentID = 0.
Barnen kallar jag genom en Procedur som kallar alla poster där PageParentID = @PageID, där PageID är idt på förälder-sidan.
Som sagt, det fungerar i första nivån, men när jag vill kalla på den för att göra samma sak med barn till barn fungerar det inte. Borde jag inte kunna återanvända den till det???
Hoppas någon förstår vad jag snackar om. Klockan är för mycket för att jag ska kunna avgöra om jag är tydlig eller om det låter som rappakalja...
Alla som läser ska ha tack, de som dessutom svarar; tusen tack :)Sv: TreeView - hur öka antalet nivåer (depth)?
aspx-sidan med TreeView-taggen:
<asp:TreeView runat="server" ID="TreeMenu1" OnTreeNodePopulate="PopulateNode" ExpandDepth="1" NodeIndent="10" >
<Nodes>
<asp:TreeNode Text="Pages" SelectAction="expand" PopulateOnDemand="true"></asp:TreeNode>
</Nodes>
</asp:TreeView>
code-behind:
Partial Class Admin_MenuControls_menuUC
Inherits System.Web.UI.UserControl
Sub GetRootPages(ByVal node as TreeNode)
Dim rootPages as RootPageList = TreeMenu.GetRootPages()
Dim p as RootPage
for each p in rootPages
Dim newNode as TreeNode = new TreeNode(p.Title, p.Id)
newNode.SelectAction = TreeNodeSelectAction.Expand
newNode.PopulateOnDemand = True
node.ChildNodes.Add(newNode)
Next
End Sub
Sub GetChildPages(ByVal node As TreeNode)
Dim pageID as String = node.Value
Dim childPages As ChildPageList = TreeMenu.GetChildPages(pageID)
Dim p as ChildPage
for each p in childPages
Dim newNode as TreeNode = New TreeNode(p.Title, p.Id)
node.ChildNodes.Add(newNode)
Next
End Sub
Sub PopulateNode(ByVal source As Object, ByVal e as TreeNodeEventArgs)
select case e.Node.Depth
case 0
GetRootPages(e.Node)
case 1
GetChildPages(e.Node)
End Select
End Sub
End Class
class-filen:
Imports System
Imports System.Data
Imports System.Collections
Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Web.UI
Imports System.Web.UI.WebControls
Public Class TreeMenu
Public Shared Function GetRootPages() As RootPageList
Dim rootPages as New RootPageList
Dim connStr As String = ConfigurationManager.ConnectionStrings("SomDBConnectionString").ConnectionString
Dim mySource as SqlDataSource = new SqlDataSource(connStr, "GetRootPages")
mySource.SelectCommandType = SqlDataSourceCommandType.StoredProcedure
Dim result as IEnumerable = mySource.Select(DataSourceSelectArguments.Empty)
dim row As DataRowView
for each row in result
rootPages.Add(New RootPage(row("PageID").ToString(), row("PageTitle").ToString()))
Next
return rootPages
End Function
Public Shared Function GetChildPages(pageID as String) As ChildPageList
Dim childPages as New ChildPageList
Dim connStr As String = ConfigurationManager.ConnectionStrings("SomDBConnectionString").ConnectionString
Dim mySource as SqlDataSource = new SqlDataSource(connStr, "GetChildPages")
mySource.SelectCommandType = SqlDataSourceCommandType.StoredProcedure
mySource.SelectParameters.Add(New Parameter("PageID", TypeCode.Int32, pageID))
Dim result as IEnumerable = mySource.Select(DataSourceSelectArguments.Empty)
dim row As DataRowView
for each row in result
childPages.Add(New ChildPage(row("PageID").ToString(), row("PageTitle").ToString()))
Next
return childPages
End Function
End Class
Public Class RootPage
Public Id as String
Public Title as String
Public sub New (ByVal id as String, ByVal title as String)
me.Id = id
me.Title = title
End Sub
End Class
Public class RootPageList
Inherits ArrayList
Default Public Shadows Property DefaultProperty(i As Integer) as RootPage
Get
Return CType(MyBase.Item(i), RootPage)
End Get
Set(ByVal value As RootPage)
MyBase.Item(i) = value
End Set
End Property
End Class
Public class ChildPage
Public Id as String
Public Title as String
Public sub New (ByVal id as String, ByVal title as String)
me.Id = id
me.Title = title
End Sub
End Class
Public class ChildPageList
Inherits ArrayList
Default Public Shadows Property DefaultProperty(i As Integer) as ChildPage
Get
Return CType(MyBase.Item(i), ChildPage)
End Get
Set(ByVal value As ChildPage)
MyBase.Item(i) = value
End Set
End Property
End Class
Det är GetChildPages() som jag vill återanvända genom att kalla på den när depthen blir djupare...
Typ:
<code>
Sub PopulateNode(ByVal source As Object, ByVal e as TreeNodeEventArgs)
select case e.Node.Depth
case 0
GetRootPages(e.Node)
case 1
GetChildPages(e.Node)
case 2
GetChildPages(e.Node)
case 3
GetChildPages(e.Node)
case 4
GetChildPages(e.Node)
End Select
End Sub
</code>
Vet inte om jag tänker helt fel, men det fungerar uppenbarligen inte :/
Sv:TreeView - hur öka antalet nivåer (depth)?
Tänkte helt rätt, hade bara inte sett att koden i GetChildPages() var satt till att expandera trädet...
(Det blev lite mer överskådligt när jag postade det här)
Så här ska det se ut i code-behind:
<code>
Sub GetChildPages(ByVal node As TreeNode)
Dim pageID as String = node.Value
Dim childPages As ChildPageList = TreeMenu.GetChildPages(pageID)
Dim p as ChildPage
for each p in childPages
Dim newNode as TreeNode = New TreeNode(p.Title, p.Id)
newNode.SelectAction = TreeNodeSelectAction.Expand
newNode.PopulateOnDemand = True
node.ChildNodes.Add(newNode)
Next
End Sub
</code>
Fungerar finfint :)
Men nu finns det här som referens till andra som vill göra samma sak. Bara att plocka koden!
Måste dock försöka anpassa så att select case satsen blir dynamisk och inte begränsar djupet på trädet...Sv: TreeView - hur öka antalet nivåer (depth)?
Sv:TreeView - hur öka antalet nivåer (depth)?
Vet inte om du löst detta?
showstartingnode="False"