Problém řazení kategorii SQL   zodpovězená otázka

VB.NET, ASP.NET MVC, SQL, Databáze

Mám prosbu ohledne razeni a vypsaní menu s kategoriemi a podkategoriemi.

Jedná se mi o výpis z DB do TreeView formou:

-MENU1

-Submenu1

-S-Submenu1

-S-Submenu2

-Submenu2

-MEnu2

V tabulce mam sloupce s daty:

ID | Nadpis | ID_Submenu

----------------------------

10101| Menu1 | NULL

10102| Menu2 | NULL

10103| Submenu1 | 10101

10104| Submenu2 | 10101

10105| S-Submenu1 | 10103

10106| S-Submenu1 | 10103

Zatím jsem docílil pouze výpisu:

10101| Menu1 | NULL | NULL

10103| Menu1 | Submenu1 | NULL

10104| Menu1 | Submenu1 | S-Submenu1

10105| Menu1 | Submenu1 | S-Submenu2

10106| Menu1 | Submenu2 | NULL

10102| Menu2 | NULL | NULL

Pomocí tohoto:

select root.nadpis as root_nadpis

, down1.nadpis as down1_nadpis

, down2.nadpis as down2_nadpis

, down3.nadpis as down3_nadpis

, root.Poradi

, root.PoradiSub

from Menu_Admin as [root]

left outer

join Menu_Admin as down1

on down1.id_submenu = root.id

left outer

join Menu_Admin as down2

on down2.id_submenu = down1.id

left outer

join Menu_Admin as down3

on down3.id_submenu = down2.id

where root.id_submenu =0

order

by /*root_nadpis

, down1_nadpis

, down2_nadpis

, down3_nadpis

, */root.poradi , root.PoradiSub ASC

Nedokáže prosím někdo pomoct?

Moc všem děkuji...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vyřešeno:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        FillTestTableSQL()
        CreateTree()
        TreeView1.ExpandAll()

    End Sub

    Dim DataTable1 As New DataTable

    Private Sub FillTestTableSQL()
        DataTable1.Clear()
        TreeView1.Nodes.Clear()

        DataTable1.Columns.Add("ID", GetType(Integer))
        DataTable1.Columns.Add("NAME", GetType(String))
        DataTable1.Columns.Add("PARENT", GetType(Integer))
        DataTable1.Columns.Add("LEVEL", GetType(Integer))

        Dim SQLConn As New Data.SqlClient.SqlConnection() 'The SQL Connection
        Dim SQLCmd As New Data.SqlClient.SqlCommand() 'The SQL Command
        Dim SQLdr As Data.SqlClient.SqlDataReader 'The Local Data Store
        Dim SQLStr As String
        Dim ConnString As String

        'Connstring = Server Name, Database Name, Windows Authentication
        ConnString = System.Configuration.ConfigurationManager.ConnectionStrings("Conn").ConnectionString.ToString

        SQLStr = "SELECT * FROM Menu"

        SQLConn.ConnectionString = ConnString 'Set the Connection String
        SQLConn.Open() 'Open the connection

        SQLCmd.Connection = SQLConn 'Sets the Connection to use with the SQL Command
        SQLCmd.CommandText = SQLStr 'Sets the SQL String
        SQLdr = SQLCmd.ExecuteReader 'Gets Data

        While SQLdr.Read() 'While Data is Present
            If SQLdr("id_submenu").ToString.Trim = "0" Then
                DataTable1.Rows.Add(Int(SQLdr("id").ToString.Trim), SQLdr("Nadpis"))
            Else
                DataTable1.Rows.Add(Int(SQLdr("id").ToString.Trim), SQLdr("Nadpis"), Int(SQLdr("id_submenu").ToString.Trim))
            End If

        End While

        SQLdr.Close() 'Close the SQLDataReader
        SQLConn.Close() 'Close the connection

        Dim i As Integer

        For i = 0 To DataTable1.Rows.Count - 1
            Dim ID1 As String = DataTable1.Rows(i).Item("ID").ToString
            DataTable1.Rows(i).Item("LEVEL") = FindLevel(ID1, 0)
        Next
    End Sub

    Private Function FindLevel(ByVal ID As String, ByRef Level As Integer) As Integer
        Dim i As Integer

        For i = 0 To DataTable1.Rows.Count - 1
            Dim ID1 As String = DataTable1.Rows(i).Item("ID").ToString
            Dim Parent1 As String = DataTable1.Rows(i).Item("PARENT").ToString

            If ID = ID1 Then
                If Parent1 = "" Then
                    Return Level
                Else
                    Level += 1
                    FindLevel(Parent1, Level)
                End If
            End If
        Next

        Return Level
    End Function

    Private Sub CreateTree()
        Dim MaxLevel1 As Integer = CInt(DataTable1.Compute("MAX(LEVEL)", ""))

        Dim i, j As Integer

        For i = 0 To MaxLevel1
            Dim Rows1() As DataRow = DataTable1.Select("LEVEL = " & i)

            For j = 0 To Rows1.Count - 1
                Dim ID1 As String = Rows1(j).Item("ID").ToString
                Dim Name1 As String = Rows1(j).Item("NAME").ToString
                Dim Parent1 As String = Rows1(j).Item("PARENT").ToString

                If Parent1 = "" Then
                    TreeView1.Nodes.Add(New TreeNode(Name1, ID1))
                Else
                    Dim Node1 As TreeNode = GetChildByValue(Parent1, TreeView1.Nodes)

                    If Not Node1 Is Nothing Then
                        Node1.ChildNodes.Add(New TreeNode(Name1, ID1))
                    End If
                End If
            Next
        Next
    End Sub

    Private Function GetChildByValue(ByVal ID1 As String, ByVal NodeCollection1 As TreeNodeCollection) As TreeNode
        For Each TreeNode1 As TreeNode In NodeCollection1
            If TreeNode1.Value = ID1 Then
                Return TreeNode1
            Else
                Dim TreeNode2 As TreeNode = GetChildByValue(ID1, TreeNode1.ChildNodes)

                If Not TreeNode2 Is Nothing Then
                    Return TreeNode2
                End If
            End If
        Next

        Return Nothing
    End Function

    Protected Sub TreeView1_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.SelectedNodeChanged
        MsgBox(TreeView1.SelectedNode.Text)
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Trochu zbytečně složité,ale pokud funguje a jste s tím spokojen, tak v pořádku

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback