如何从数据库表中选择datat到treeview控件VB.NET?

如何从数据库表中选择datat到treeview控件VB.NET?,vb.net,treeview,Vb.net,Treeview,VB.NET 我的下表包含了如下图片所示的数据: 现在,我想将这些数据放入treeview控件,如另一张图所示: 请问,我如何在VB.NET中做到这一点? '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 以下是我最后得到的代码: Sub LoadTree() Dim sql As String = "SELECT Employees.EmpNum , Employees.EmpName , de

VB.NET 我的下表包含了如下图片所示的数据:

现在,我想将这些数据放入treeview控件,如另一张图所示:

请问,我如何在VB.NET中做到这一点? '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 以下是我最后得到的代码:

Sub LoadTree()
    Dim sql As String = "SELECT Employees.EmpNum , Employees.EmpName , departments.depNum,  departments.depName,  Company.ID, Company.CompName FROM Company INNER JOIN departments ON Company.ID = departments.compNum INNER JOIN  Employees ON departments.depNum = Employees.depNum order by company.compName , departments.depName "
    Dim dt As New DataTable()
    Dim da As New SqlDataAdapter(sql, FrmMain.con)
    da.Fill(dt)

    TreeView1.Nodes.Clear()
    Dim CompanyName As String
    Dim depName As String
    Dim EmpName As String
    Dim tmpCName As String = ""
    Dim tmpDName As String = ""
    Dim sNode As New TreeNode
    Dim ssNode As New TreeNode

    'TreeView1.Nodes.Add("Dhafer")

    For Each dr As DataRow In dt.Rows
        CompanyName = dr("CompName").ToString()
        depName = dr("depName").ToString()
        EmpName = dr("EmpName").ToString()

        If tmpCName = CompanyName Then
            If tmpDName <> depName Then
                TreeView1.SelectedNode.Nodes.Add(depName).Nodes.Add(EmpName)
            End If               
        Else
            tmpCName = CompanyName
            tmpDName = depName
            sNode = TreeView1.Nodes.Add(CompanyName)
            TreeView1.SelectedNode = sNode

            TreeView1.SelectedNode.Nodes.Add(depName).Nodes.Add(EmpName)
        End If
子加载树()
Dim sql As String=“从公司内部选择Employees.EmpNum、Employees.EmpName、departments.depNum、departments.depName、Company.ID、Company.CompName加入公司上的部门。ID=部门。compNum内部加入部门上的员工。depNum=员工。depNum按公司排序。CompName、departments.depName”
Dim dt作为新数据表()
Dim da作为新的SqlDataAdapter(sql,FrmMain.con)
da.填充(dt)
TreeView1.Nodes.Clear()
Dim CompanyName作为字符串
将depName设置为字符串
将名称设置为字符串
Dim tmpCName As String=“”
Dim tmpDName As String=“”
作为新的树状结构的暗势垒
Dim ssNode作为新的TreeNode
'TreeView1.Nodes.Add(“Dhafer”)
对于dt.行中的每个dr As数据行
CompanyName=dr(“CompName”).ToString()
depName=dr(“depName”).ToString()
EmpName=dr(“EmpName”).ToString()
如果tmpCName=CompanyName,则
如果tmpDName depName,则
TreeView.1.SelectedNode.Nodes.Add(depName).Nodes.Add(EmpName)
如果结束
其他的
tmpCName=CompanyName
tmpDName=depName
sNode=TreeView1.Nodes.Add(CompanyName)
TreeView1.SelectedNode=sNode
TreeView.1.SelectedNode.Nodes.Add(depName).Nodes.Add(EmpName)
如果结束

树节点有名称属性,树节点集合(树视图节点或树节点本体)可以使您的逻辑更像:

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 = treeview.Nodes.Find(coNodeId, true)
    Dim coNode as TreeNode

    If nodes.Length = 0 Then 'didn't find: create and add
       coNode = New TreeNode() { Name = coNodeId, Text = coName }
       treeview.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()
    ...
对于数据表中的每一行,我们:

  • 试着找到co节点,创建它,如果它不存在,然后继续引用它
  • 尝试在co节点下查找dep节点,如果不存在,则创建,保留对它的引用
  • 将emp节点添加到dep节点下

步骤1确保找到或创建co节点,以便步骤2可以工作。步骤2确保创建或找到dep节点,以便步骤3可以工作

关于执行此类操作,有很多信息。当你遇到实际问题时,你需要先努力,然后在这里发布。因此,这里不是我们为您编写代码或从头开始教您东西的地方。3天以来,我做了很多工作,付出了很多努力,我一直试图解决数据冗余的问题,但我无法解决。现在,我陷入了这个问题,停止了我的工作。如果有可能解决这个问题,我会感谢你。我们很乐意为你提出适当的问题,但你需要向我们展示你到底做了什么,以及你到底陷入了什么困境,包括解释你到底期望什么和发生了什么。更新后的问题更好,但仍然缺少一些应该包含在每个问题中的细节。也没有迹象表明您在编写实现该算法的代码之前,先花时间开发了一个算法。如果您不知道代码必须做什么,您如何编写它。如果你能手工完成任务,你可以写一个算法。非常感谢兄弟。这是什么意思?{Name=depNodeId,Text=depName},在运行应用程序时,我遇到了以下错误:类型为“Boolean”的错误2值无法转换为“System.Windows.Forms.TreeNode”。这是创建新对象并设置其属性的一种简单方法。它的意思与新的TreeNode的Dim x相同,共3行代码。我不确定这个错误会在我的代码中的什么地方抛出,特别是因为我希望它会出现在VisualStudioDesign中,而不是在运行应用程序时。将完整代码作为新问题发布,并将我链接到它。在某个地方,在an=的左侧有一个treeNode类型的对象,在右侧有一个Boolean类型的对象,比如
Dim x as treeNode
x=True
-我看不到我在哪里做过这件事,但我可能会被误认为它对我来说不正确。我只是得到了空节点!!!我不知道问题出在哪里当你说“空节点”时你是指“没有文本的节点”还是“没有子节点”是的,没有文本的节点我也尝试编辑代码,MyCompany节点是重复的