TreeView zobrazení dat z SqlDataReader   otázka

VB.NET, SQL, ADO.NET, WinForms, Databáze

Zdravám chtěl bych vypsat data z tabulky do TreeView

Data v tabulce TestTab

ID parentID popis

1 0 a

2 1 b

3 1 c

4 2 d

5 2 e

6 3 f

7 3 g

8 5 h

chtěl bych tyto data vypsat v TreeView tímto způsobem:

-a

--b

---d

---e

----h

--c

---f

---g

Tento kod tak nějak nefunguje:

        Dim thisCommand As New SqlCommand
        Dim thisCommand2 As New SqlCommand
        Dim RS As SqlDataReader
        Dim ID, ParentID As String
        Dim Popis As String
        Dim con As New SqlClient.SqlConnection

        con.ConnectionString = "server=XXXXX;integrated Security=SSPI;DATABASE=MPO"
        con.Open()

        With thisCommand
            .Connection = con
            .CommandText = "UlozenaProcedura" ' v proceduře je: SELECT id, parentID, popis from TestTab
            .CommandType = CommandType.StoredProcedure
        End With

        RS = thisCommand.ExecuteReader()
        Do While RS.Read()
            ID = RS(RS.GetOrdinal("ID"))
            ParentID = RS(RS.GetOrdinal("ParentID"))
            Popis = RS(RS.GetOrdinal("Popis")).ToString()

            ' nefunguje to tak jak bych chtěl
            'If ID <> "" And ParentID = 0 Then
            '    Me.TreeView.Nodes.Add(ID, "" & Popis & "")
            'Else
            '    Me.TreeView.Nodes(ParentID).Nodes.Add(ID, "" & Popis & "")
            'End If
            ' nefunguje to tak jak bych chtěl
        Loop
        RS.Close()
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použijte rekurzivní čtení postupně všechny levely podle ParentID. Začněte jen u prvků v prvním levelu.

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

Ale pokud chcete číst v jedné iteraci, jde to takhle (ovšem v případě, že máte prvky seřazené):

        Dim thisCommand As New SqlCommand
        Dim thisCommand2 As New SqlCommand
        Dim RS As SqlDataReader
        Dim ID As Integer, ParentID As Integer
        Dim Popis As String
        Dim con As New SqlClient.SqlConnection

        con.ConnectionString = "server=XXXXX;integrated Security=SSPI;DATABASE=MPO"
        con.Open()

        With thisCommand
            .Connection = con
            .CommandText = "SELECT id, parentID, popis from TestTab" 
        End With

        RS = thisCommand.ExecuteReader()
        Do While RS.Read()
            ID = RS("ID")
            ParentID = RS("ParentID")
            Popis = RS("Popis")

            If ParentID = 0 Then
                Me.TreeView.Nodes.Add(ID, Popis)
            Else
                Me.TreeView.Nodes(ParentID).Nodes.Add(ID, Popis)
            End If
        Loop
        RS.Close()

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

Zdravím, dík za pomoc, ale iterace je N. Sehnal jsem kód, který vykreslí strom, ale je tam jeden problémek, potřebuji aby z DB byly ve stromu obsaženy informace o ID čísle záznamu.

Nový kod, který funguje, bohužel z DB zobrazuje jen Popis.

    Private Sub FRM_TreeView2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            con.ConnectionString = "server=XXX;integrated Security=SSPI;DATABASE=TEST"
            con.Open()
        Catch exc As SqlClient.SqlException
            MessageBox.Show("Nepodařilo se připojit na SQL server.", "XXX", MessageBoxButtons.OK)
        End Try
        PUB_ZobrazStrom()
    End Sub


    Public Sub PUB_ZobrazStrom()
        Dim ds As New DataSet
        Dim cmd As New SqlCommand
        Dim da As New SqlClient.SqlDataAdapter(cmd)
        dt = ds.Tables.Add

        With cmd
            .Connection = con
            .CommandText = "Ulozenaprocedura" ' ZDROJ "SELECT id, parentID, popis from TestTab" 
            .CommandType = CommandType.StoredProcedure

        End With
        da.Fill(dt)
        AddNodes(dt, dt.Select("isnull(idparent, -1) = -1"), TreeView1.Nodes)
    End Sub

    Private Sub AddNodes(ByVal dt As DataTable, ByVal Rows As DataRow(), ByVal Nodes As TreeNodeCollection)
        For Each row As DataRow In Rows
            Dim node As TreeNode
            Dim SubRows() As DataRow

            node = Nodes.Add(row(2).ToString)
            SubRows = dt.Select("idparent = " & DirectCast(row(0), Integer))
            AddNodes(dt, SubRows, node.Nodes)
        Next
    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nedaří se mi v té poslední části "Private Sub AddNotes......."

i když řádky v dt mám, program hned skončí??.

Nevíte o nějakém příkladu, kde bych se mohl vyučit?

Díky

nahlásit spamnahlásit spam 1 / 1 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