根据listbox access数据库vb.net中的选择显示GroupBox

根据listbox access数据库vb.net中的选择显示GroupBox,vb.net,ms-access,listbox,visual-studio-2019,Vb.net,Ms Access,Listbox,Visual Studio 2019,我有一个带有地址的access数据库表和一个带有地址类型的表。 当我添加一个新关系时,会有不同的分组框,其中包含根据地址类型显示的附加信息。 例如:患者只有基本地址信息。 医生也需要参考号,所以如果我点击关系类型“医生”,地址分组框应该会出现,但也会出现带有医生参考号的分组框文本框。 实例还应该获得实例groupbox+地址groupbox等。 地址也可以是“多种类型”,所以如果一个地址是A:医生,B:实例,这两个框都应该出现。 我当前的代码如下所示: Public Class NewRela

我有一个带有地址的access数据库表和一个带有地址类型的表。 当我添加一个新关系时,会有不同的分组框,其中包含根据地址类型显示的附加信息。 例如:患者只有基本地址信息。 医生也需要参考号,所以如果我点击关系类型“医生”,地址分组框应该会出现,但也会出现带有医生参考号的分组框文本框。 实例还应该获得实例groupbox+地址groupbox等。 地址也可以是“多种类型”,所以如果一个地址是A:医生,B:实例,这两个框都应该出现。 我当前的代码如下所示:


Public Class NewRelationForm

        'groupboxen disablen on load
        Me.grpKiesUwRelatietype.Visible = True
        Me.grpBasisData.Visible = False
        Me.grpDataBI.Visible = False
        Me.grpFoto_Nota.Visible = False
        Me.grpHuisartsData.Visible = False
        Me.grpPartijData.Visible = False
        Me.grpVerwijzerdata.Visible = False

    End Sub

    'KNOPPEN en Functies!
    Private Sub NewRelationForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
               Me.Tbl_TypeTableAdapter1.Fill(Me.PatientenDatabaseDataSetX1.tbl_Type)
Me.Tbl_OnderzoeksTypesTableAdapter.Fill(Me.PatientenDatabaseDataSetX1.tbl_OnderzoeksTypes)
Me.Tbl_RelatiesTableAdapter.Fill(Me.PatientenDatabaseDataSetX.tbl_Relaties)
    End Sub
    Private Sub btnAddRelation_Click(sender As Object, e As EventArgs) Handles btnAddRelation.Click
        FormMakeRelationType.Show()
    End Sub

    Private Sub lboxRelatieTypes_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lboxRelatieTypes.SelectedIndexChanged

    End Sub

    'Private Sub lboxRelatieTypes_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lboxRelatieTypes.SelectedIndexChanged
    ''If ComboBox1.SelectedIndex = 1 Then
    ''    grpBasisData.Visible = True
    ''    grpFoto_Nota.Visible = True
    ''    grpFoto_Nota.Location = New Point(720, 120)
    ''End If
    'End Sub

End Class
我真的可以用一个指针来做这件事,我试过if-else,我试过select-case,但我找不到“正确的方法”。 我是初学者 edit1:这是winform中的图片: 这是访问数据库(数据库中的名称出于隐私目的而更改)

我制作了一个代码示例,根据列表框显示groupbox中的文本框

表单加载事件:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\PatientenDatabase.mdb")
        con.Open()
        Dim sql As String = "select Type_Naam from tbl_type"
        Dim command As New OleDbCommand(sql, con)
        Dim reader As OleDbDataReader = command.ExecuteReader()
        While reader.Read()
            ListBox1.Items.Add(reader.GetString(0))
        End While

        con.Close()
    End Sub
Listboxindexchanged事件:

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
        Dim curItem As String = ListBox1.SelectedItem.ToString()
        Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\PatientenDatabase.mdb")
        con.Open()
        Dim sql As String = String.Format("select * from tbl_Relaties where Rel_Type='{0}'", curItem)
        Dim command As New OleDbCommand(sql, con)
        Dim reader As OleDbDataReader = command.ExecuteReader()

        If reader.HasRows Then
            While reader.Read()
                txtID.Text = reader.GetValue(0).ToString()
                txtType.Text = reader.GetValue(1).ToString()
                txtName.Text = reader.GetValue(2).ToString()
                txtVoo.Text = reader.GetValue(3).ToString()
                txtAdress.Text = reader.GetValue(4).ToString()
            End While
        Else
            txtID.Text = String.Empty
            txtType.Text = String.Empty
            txtName.Text = String.Empty
            txtVoo.Text = String.Empty
            txtAdress.Text = String.Empty
        End If
        con.Close()
    End Sub
最终结果:

此外,我只编写了几个列代码,您可以按照上面的代码来完成其余的代码。

我找到了它。。。 根据stackoverflow中的一篇文章:

如果有人知道如何使这段代码“更容易处理”或“更紧凑”,我会非常乐于接受这些想法。 另外:我只能选择一个,其余的分组框不显示,因此需要一些微调,但我有90%在那里

Private Sub lboxRelatieTypes_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lboxRelatieTypes.SelectedIndexChanged
        If lboxRelatieTypes.Text.Trim.Contains("Patiënt") = True Then
            Me.grpBasisData.Visible = True
            Me.grpDataBI.Visible = False
            Me.grpFoto_Nota.Visible = True
            Me.grpHuisartsData.Visible = False
            Me.grpPartijData.Visible = False
            Me.grpVerwijzerdata.Visible = False
        ElseIf lboxRelatieTypes.Text.Trim.Contains("Verwijzer") = True Then
            Me.grpBasisData.Visible = True
            Me.grpDataBI.Visible = False
            Me.grpFoto_Nota.Visible = True
            Me.grpHuisartsData.Visible = False
            Me.grpPartijData.Visible = False
            Me.grpVerwijzerdata.Visible = True
        ElseIf lboxRelatieTypes.Text.Trim.Contains("Betalende Instantie") = True Then
            Me.grpBasisData.Visible = True
            Me.grpDataBI.Visible = True
            Me.grpFoto_Nota.Visible = True
            Me.grpHuisartsData.Visible = False
            Me.grpPartijData.Visible = True
            Me.grpVerwijzerdata.Visible = False
        ElseIf lboxRelatieTypes.Text.Trim.Contains("Huisarts") = True Then
            Me.grpBasisData.Visible = True
            Me.grpDataBI.Visible = False
            Me.grpFoto_Nota.Visible = True
            Me.grpHuisartsData.Visible = True
            Me.grpPartijData.Visible = False
            Me.grpVerwijzerdata.Visible = False
        ElseIf lboxRelatieTypes.Text.Trim.Contains("Huisarts" & "Betalende Instantie") = True Then
            Me.grpBasisData.Visible = True
            Me.grpDataBI.Visible = True
            Me.grpFoto_Nota.Visible = True
            Me.grpHuisartsData.Visible = True
            Me.grpPartijData.Visible = False
            Me.grpVerwijzerdata.Visible = False
        End If

        'Dim curitem As String = lboxRelatieTypes.SelectedItems.ToString()
        'Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\GoogleDrive\EINDWERK VBNET\PatientenDatabase.accdb")
        'con.Open()
        'Dim sql As String = String.Format("select * from tbl_Relaties where Rel_Type='{0}'", curitem)
        'Dim command As New OleDbCommand(sql, con)
        'Dim reader As OleDbDataReader = command.ExecuteReader()
        'If curitem.Contains "Huisarts" Then
        ' End If
        'con.Close()

@lzzy,你能提供access数据库中的表和你在winform中设计的图像吗?它能让你的问题更清楚。@JackJJun MSFT:我添加了你的请求data@lzzy,根据我的测试,我发现以下问题。首先,我没有看到数据库中的addresses and address types表。其次,您提供的大部分代码都是与您的问题无关,请删除它们。第三,我认为您需要澄清您的需求和逻辑,以便其他人更清楚地理解您的问题。@JackJJun MSFT:我删除了不需要的代码。这些表是tbl_Relaties(荷兰语表示“relations”)和tbl_类型。“formMakeRelationType”形式具有更新tbl_类型表的代码,并使用此表单中的关系类型工作和更新列表框。因为关系可以同时是多种类型,但不是每个地址都“需要”某些类型的信息,如果我不选择listbox中的类型,则不应显示包含该不相关信息的groupbox,以免显示太多数据。我的想法是根据选择来执行select case代码,以显示groupbox。@lzzy,有什么更新吗?J Jun:您的示例很好,但这不是问题;-)。我的数据库中的关系可以是“多种类型”。医生也可以是转发器,付费瞬间也可以是医生和转发器,多个组合是可能的。因此,列表框是“multiselect”。每种类型都有自己的额外分组框,其中包含特定的额外信息。因此,如果我选择“patient”,groupbox 1和3必须可见,如果它也是一个付费实例,groupbox 4也必须可见。等等由于该表单是“添加新关系”表单,因此无需将数据放入文本框,仅在需要时显示。如是:只要我单击GroupBox,就会显示所需的文本框,以便填写必要的数据。添加类型时,GroupBox设置为“不可见”,并设置为“可见”。我尝试使用“for each”和“select case”,但找不到合适的syntax@lzzy,你提供的gif不清楚,你能给我一个新屏幕来告诉我你想做什么吗。Jun:屏幕看起来是这样的(),所以当我想添加一个关系类型“patient”,它也是一个“paying instance”时,我会选择左边列表框中的那些。选择时,应显示响应该类型的GroupBox。我的gif视频太小了,我知道,但它显示了needed@lzzy,您的意思是可以根据数据库中的关系显示正确的分组框吗?如果是,请告诉我具体关系。