Member 13714641 Ответов: 2

Почему бы не проверить, что дочерние узлы не отображаются в виде списка(отображается только первый уровень родительских узлов)?


всем привет..
я работаю с vb.net 2015 и sql 2014,и у меня есть treeview с 5 уровнями и listview с 2 столбцами(id, name), которые я хочу отправить индекс и текст всех проверенных узлов
в lisview..

это хорошо работает на первом уровне, но никаких детей не отправляют в listview.
до сих пор я пробовал этот код:

спасибо.

Что я уже пробовал:

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    ListView1.Items.Clear()
    'AddToList(TreeView1.Nodes)
    AddToList1()
    Dim constr As String = (ConfigurationManager.ConnectionStrings("conStr").ConnectionString)
    Dim con As New SqlConnection(constr)
    con.Open()
    For Each item As ListViewItem In ListView1.Items
        Dim cmd As SqlCommand = New SqlCommand("Insert Into F_PERMENU(INDEX_F,parent_node,compid,user_id) Values ('" & item.Text & "','" & item.SubItems.Item(1).Text & "','" & TextBox10.Text & "','" & TextBox7.Text & "')", con)
        cmd.ExecuteNonQuery()
    Next
    con.Close()
End Sub

Private Sub AddToList1()
    ListView1.Columns.Clear()
    Dim TempStr(1) As String
    Dim TempNode As New ListViewItem
    ' Show "hidden" text
    ListView1.ShowItemToolTips = True
    ' Set columnar mode
    ListView1.View = View.Details
    ' Set column header
    ListView1.Columns.Add("ایندکس", 80)
    ListView1.Columns.Add("متن", 120)
    ' Remove previous items
    ListView1.Items.Clear()
    For Each tnd As TreeNode In TreeView1.Nodes
        If tnd.Checked Then
            ' Add two items
            TempStr(0) = tnd.Index
            TempStr(1) = tnd.Text
            TempNode = New ListViewItem(TempStr)
            ListView1.Items.Add(TempNode)
        End If
    Next
End Sub

Richard Deeming

New SqlCommand("Insert Into F_PERMENU(INDEX_F,parent_node,compid,user_id) Values ('" & item.Text & "','" & item.SubItems.Item(1).Text & "','" & TextBox10.Text & "','" & TextBox7.Text & "')", con)


Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Using cmd As New SqlCommand("Insert Into F_PERMENU (INDEX_F, parent_node, compid, user_id) Values (@INDEX_F, @parent_node, @compid, @user_id)", con)
    cmd.Parameters.AddWithValue("@INDEX_F", item.Text)
    cmd.Parameters.AddWithValue("@parent_node", item.SubItems.Item(1).Text)
    cmd.Parameters.AddWithValue("@compid", TextBox10.Text)
    cmd.Parameters.AddWithValue("@user_id", TextBox7.Text)
    
    cmd.ExecuteNonQuery();
End Using


Как только вы это исправите, сделайте себе одолжение и дайте своим элементам управления значимые имена. Может быть ты помнишь что TextBox42 представляет сейчас но когда вы вернетесь, чтобы отредактировать свой код через шесть месяцев, у вас не будет ни малейшего понятия!

2 Ответов

Рейтинг:
7

Member 13714641

Благодарю Вас, Ричард Диминг, за ваш ответ....

Я исправляю это:

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
       ListView1.Items.Clear()
       'AddToList(TreeView1.Nodes)
       AddToList1()
       Dim constr As String = (ConfigurationManager.ConnectionStrings("conStr").ConnectionString)
       Dim con As New SqlConnection(constr)
       con.Open()
       For Each item As ListViewItem In ListView1.Items
           'Dim cmd As SqlCommand = New SqlCommand("Insert Into F_PERMENU(INDEX_F,parent_node,compid,user_id) Values ('" & item.Text & "','" & item.SubItems.Item(1).Text & "','" & compidtxt.Text & "','" & user_idtxt.Text & "')", con)
           'cmd.ExecuteNonQuery()
           Using cmd As New SqlCommand("Insert Into F_PERMENU (INDEX_F,parent_node,compid,user_id) Values (@INDEX_F, @parent_node, @compid, @user_id)", con)
               cmd.Parameters.AddWithValue("@INDEX_F", item.Text)
               cmd.Parameters.AddWithValue("@parent_node", item.SubItems.Item(1).Text)
               cmd.Parameters.AddWithValue("@compid", compidtxt.Text)
               cmd.Parameters.AddWithValue("@user_id", user_idtxt.Text)
               cmd.ExecuteNonQuery()
           End Using
       Next
       con.Close()
       DataGridView1.DataSource = masterBindingSource
       DataGridView2.DataSource = detailsBindingSource
   End Sub

Private Sub AddToList1()
       ListView1.Columns.Clear()
       Dim TempStr(1) As String
       Dim TempNode As ListViewItem
       ' Show "hidden" text
       ListView1.ShowItemToolTips = True
       ' Set columnar mode
       ListView1.View = View.Details
       ' Set column header
       ListView1.Columns.Add("ایندکس", 80)
       ListView1.Columns.Add("متن", 120)
       ' Remove previous items
       ListView1.Items.Clear()
       For Each tnd As TreeNode In GET_ALL_PARENT_AND_CHILD_NODES(TreeView1)
           If tnd.Checked Then
               ' Add two items
               TempStr(0) = tnd.Index
               TempStr(1) = tnd.Text
               TempNode = New ListViewItem(TempStr)
               ListView1.Items.Add(TempNode)
           End If
       Next
   End Sub

Public Function GET_ALL_PARENT_AND_CHILD_NODES(ByVal tree As TreeView) As List(Of TreeNode)
       Dim nodes As New List(Of TreeNode)
       Dim queue As New Queue(Of TreeNode)
       Dim top As TreeNode
       Dim nod As TreeNode
       For Each top In tree.Nodes
           queue.Enqueue(top)
       Next
       While (queue.Count > 0)
           top = queue.Dequeue
           nodes.Add(top)
           For Each nod In top.Nodes
               queue.Enqueue(nod)
           Next
       End While
       GET_ALL_PARENT_AND_CHILD_NODES = nodes
   End Function


Рейтинг:
15

Member 13714641

Привет, Эвери Боди..
наконец, я смог решить проблему с помощью этой функции:

Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    ListView1.Items.Clear()
    AddToList1()
    Dim constr As String = (ConfigurationManager.ConnectionStrings("conStr").ConnectionString)
    Dim con As New SqlConnection(constr)
    con.Open()
    For Each item As ListViewItem In ListView1.Items
        Dim cmd As SqlCommand = New SqlCommand("Insert Into F_PERMENU(INDEX_F,parent_node,compid,user_id) Values ('" & item.Text & "','" & item.SubItems.Item(1).Text & "','" & TextBox10.Text & "','" & TextBox7.Text & "')", con)
        cmd.ExecuteNonQuery()
    Next
    con.Close()
End Sub

Private Sub AddToList1()
        ListView1.Columns.Clear()
        Dim TempStr(1) As String
        Dim TempNode As ListViewItem
        ' Show "hidden" text
        ListView1.ShowItemToolTips = True
        ' Set columnar mode
        ListView1.View = View.Details
        ' Set column header
        ListView1.Columns.Add("ایندکس", 80)
        ListView1.Columns.Add("متن", 120)
        ' Remove previous items
        ListView1.Items.Clear()
        For Each tnd As TreeNode In GET_ALL_PARENT_AND_CHILD_NODES(TreeView1)
            If tnd.Checked Then
                ' Add two items
                TempStr(0) = tnd.Index
                TempStr(1) = tnd.Text
                TempNode = New ListViewItem(TempStr)
                ListView1.Items.Add(TempNode)
            End If
        Next
    End Sub

    Public Function GET_ALL_PARENT_AND_CHILD_NODES(ByVal tree As TreeView) As List(Of TreeNode)
        Dim nodes As New List(Of TreeNode)
        Dim queue As New Queue(Of TreeNode)
        Dim top As TreeNode
        Dim nod As TreeNode
        For Each top In tree.Nodes
            queue.Enqueue(top)
        Next
        While (queue.Count > 0)
            top = queue.Dequeue
            nodes.Add(top)
            For Each nod In top.Nodes
                queue.Enqueue(nod)
            Next
        End While
        GET_ALL_PARENT_AND_CHILD_NODES = nodes
    End Function


Richard Deeming

Однако вы все еще не исправили критическую уязвимость безопасности в своем коде.