0

2つのリストボックスを持つフォームがあります。ここでは、listbox1に俳優と女優の名前が入力されています。listbox1から名前を選択した場合、listbox2には、その名前が関係する映画のタイトルが表示されます。別の名前が選択されている場合、listbox2には、2つの名前が関係している映画のタイトルが表示されます。

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つのアイテムを選択すると、結果は正しいですが、多くのスペースが残ります。ここに私のフォームのスクリーンショットがあります:http ://www.flickr.com/photos/92925726@N06/8445945758/in/photostream/

私がactor3を選択すると、出力が悪化します:http ://www.flickr.com/photos/92925726@N06/8445945724/in/photostream/

4

1 に答える 1

1

lstTitleあなたの主な問題は、新しい選択でそれを再ロードする前にあなたがあなたのコントロールをクリアしないことであるように思われます。したがって、新しい名前を選択するたびに、その名前のすべてのタイトルが、すでにロードされている既存のタイトルのリストに追加されます。また、整数を使用してすべてのインデックスを反復する代わりに、For Eachループを使用する方が簡単です。

lstTitle.Items.Clear()
For Each row As DataRow In myDataTable.Rows
    lstTitle.Items.Add(row("mTitle"))
Next

ただし、次のようにSQLステートメントを動的に構築するのではなく、クエリでパラメータを使用する必要があることにも言及する必要があります。

myCmd.CommandText = "select mTitle from selectmovie where cName = @name"
myCmd.Parameters.AddWithValue("name", lstNames.SelectedItem)

選択した複数の俳優のすべてが関与するすべての映画を選択するには、各俳優のwhere句に条件を追加する必要があります。たとえば、次のようになります。

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()
于 2013-02-04T21:17:50.963 に答える