VB. NET копировать данные из treevew в datagridview - PullRequest
0 голосов
/ 09 мая 2020

Я хочу скопировать некоторые / все данные из treeview в datagridview Например: если я выбираю один узел отдела или узла компании, когда я нажимаю кнопку, я хочу, чтобы все сотрудники этого узла были скопированы в datagridview с проверкой на повтор.

Кто-нибудь, пожалуйста, объясните мне механизм этого.

Это код, который я пытался написать, но у меня возникли трудности с его созданием

For i = 0 To TreeView1.Nodes.Count - 1
        'MsgBox(i & " " & TreeView1.Nodes(i).Text)
        Dim node As TreeNode = TreeView1.Nodes(i)
        For j = 0 To node.Nodes.Count - 1
            'MsgBox(j & " " & node.Nodes(j).Text)
            Dim subnode As TreeNode = node.Nodes(j)
            For z = 0 To subnode.Nodes.Count - 1
                'MsgBox(z & " " & subnode.Nodes(z).Text)
                Dim Usubnode As TreeNode = subnode.Nodes(j)
                DGV.Rows(z).Cells(0).Value = subnode.Nodes(z).Name.ToString
                DGV.Rows(z).Cells(1).Value = subnode.Nodes(z).Text.ToString
            Next  '' z
        Next   ''j
    Next  '' i

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '

enter image description here

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

 For Each dr As DataRow In dt.Rows
        Dim coName = dr("CompName").ToString()
        Dim coNodeId = "co" & dr("ID").ToString()

        ''''find or create the company node
        Dim nodes = TreeView2.Nodes.Find(coNodeId, True)
        Dim coNode As TreeNode

        If nodes.Length = False Then ''''didn't find: create and add
            coNode = New TreeNode()  {.Name = coNodeId, .Text = coName}
            TreeView2.Nodes.Add(coNode)

        Else ''''did find
            coNode = nodes(0)
        End If


        Dim depName = dr("depName").ToString()
        Dim depNodeId = "dep" & dr("depNum").ToString()

        ''''find or create the dep node under the co node
        nodes = coNode.Nodes.Find(depNodeId, True)
        Dim depNode As TreeNode

        If nodes.Length = 0 Then
            depNode = New TreeNode()  {.Name = depNodeId, .Text = depName}
            coNode.Nodes.Add(depNode)
        Else
            depNode = nodes(0)
        End If
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ''''create the emp node
        Dim EmpName = dr("EmpName").ToString()
        Dim empNodeId = "emp" & dr("EmpNum").ToString()

        ''''find or create the emp node under the dep node
        nodes = depNode.Nodes.Find(empNodeId, True)
        Dim empNode As TreeNode

        If nodes.Length = 0 Then
            empNode = New TreeNode()  {.Name = empNodeId, .Text = EmpName}
            depNode.Nodes.Add(empNode)
        Else
            empNode = nodes(0)
        End If

    Next

1 Ответ

0 голосов
/ 09 мая 2020

Вы заполнили дерево из таблицы данных. Свяжите сетку с той же таблицей через BindingSource. Пока вы добавляете узлы, сохраните строку в теге узла, чтобы определить фильтр BindingSource:

depNode = New TreeNode()  {.Name = depNodeId, .Text = depName, .Tag = $"[depNum] = '{dr("depNum")}'"}

Поместите другой фильтр для каждого типа узла (co / dep / emp)

Добавьте обработчик к событию AfterSelect древовидного представления (https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-determine-which-treeview-node-was-clicked-windows-forms) и установите для свойства Filter BindingSource значение e.Node.Tag.ToString()

...