Vb.net 使用vb 2008获取要在另一个列表框中显示的选定列表框项目值

Vb.net 使用vb 2008获取要在另一个列表框中显示的选定列表框项目值,vb.net,listbox,Vb.net,Listbox,我有一个带有两个列表框的表单。在这里,listbox1中填充了男女演员的名字。如果从listbox1中选择了一个名称,则listbox2应显示涉及该名称的电影的标题。如果选择了另一个名称,listbox2将显示涉及该名称的电影的标题 Call Connect() With Me STRSQL = "select mTitle from selectmovie where cName = '" & lstNames.SelectedItem & "'"

我有一个带有两个列表框的表单。在这里,listbox1中填充了男女演员的名字。如果从listbox1中选择了一个名称,则listbox2应显示涉及该名称的电影的标题。如果选择了另一个名称,listbox2将显示涉及该名称的电影的标题

Call Connect()
    With Me
        STRSQL = "select mTitle from selectmovie where cName = '" & lstNames.SelectedItem & "'"
        Try
            myCmd.Connection = myConn
            myCmd.CommandText = STRSQL
            myReader = myCmd.ExecuteReader
            If (myReader.Read()) Then
                myReader.Close()
                myAdptr.SelectCommand = myCmd
                myAdptr.Fill(myDataTable)
                lstTitle.DisplayMember = "mTitle"
                lstTitle.ValueMember = "mTitle"

                If myDataTable.Rows.Count > 0 Then
                    For i As Integer = 0 To myDataTable.Rows.Count - 1
                        lstTitle.Items.Add(myDataTable.Rows(i)("mTitle"))
                    Next
                End If
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End With
没有错误。当我选择1项时,结果是正确的,但留下了很多空间。下面是我表格的屏幕截图:


当我选择actor3时,输出变得更糟:

您的主要问题似乎是在使用新选择重新加载lstTitle控件之前没有清除它。因此,每次选择新名称时,它都会将该名称的所有标题添加到已加载的现有标题列表中。此外,与使用整数迭代所有索引不同,只需为每个循环使用一个:

但是,我还必须提到,您确实应该在查询中使用参数,而不是像这样动态构建SQL语句,例如:

myCmd.CommandText = "select mTitle from selectmovie where cName = @name"
myCmd.Parameters.AddWithValue("name", lstNames.SelectedItem)
Dim builder As New StringBuilder()
builder.Append("select distinct mTitle from selectmovie where ")
For i As Integer = 0 to lstNames.SelectedItems.Count - 1
    Dim parameterName As String = "@name" & i.ToString()
    If i <> 0 Then
        builder.Append("and ")
    End If
    builder.Append(parameterName)
    builder.Append(" in (select cName from selectmovie where mTitle = m.mTitle) ")
    myCmd.Parameters.AddWithValue(parameterName, lstNames.SelectedItems(i))
Next
myCmd.CommandText = builder.ToString()
要选择涉及多个选定演员的所有电影,您需要为每个演员的where子句添加一个附加条件,例如:

myCmd.CommandText = "select mTitle from selectmovie where cName = @name"
myCmd.Parameters.AddWithValue("name", lstNames.SelectedItem)
Dim builder As New StringBuilder()
builder.Append("select distinct mTitle from selectmovie where ")
For i As Integer = 0 to lstNames.SelectedItems.Count - 1
    Dim parameterName As String = "@name" & i.ToString()
    If i <> 0 Then
        builder.Append("and ")
    End If
    builder.Append(parameterName)
    builder.Append(" in (select cName from selectmovie where mTitle = m.mTitle) ")
    myCmd.Parameters.AddWithValue(parameterName, lstNames.SelectedItems(i))
Next
myCmd.CommandText = builder.ToString()

谢谢史蒂文,我遵循了你的建议,但仍然得到了相同的结果:除了当我选择另一个项目时,它现在正确地显示了列表的部分。有什么问题吗,先生?所以当演员1被选中时,它只显示那些空白的?如果是这样,您确定这些空白项实际上不在数据库中吗?不,不是,先生。我将其存储在数据库中,如下所示:是的,问题是选择actor1时出现的空白项,但这些空白项不在数据库中,先生。实际上,它出现在第一个选中的项目中,所以即使我先选择了actor5,它仍然是一样的。我该如何解决这个问题?@VBeginner,别忘了点击他答案旁边的复选标记来确认他的救生技能。