首页 > 解决方案 > : '不能绑定到新的值成员。参数名称:value' vb.net 以及如何使用组合框中的值

问题描述

我正在尝试将数据库中的一些项目放入我的第三个组合框,对于前两个,没有问题,但是在尝试填充最后一个时我遇到了一个。这是错误消息:

: '不能绑定到新的值成员。参数名称:值'

此外,如果有人知道我如何使用从 RoomNumber 组合框中的 RoomType 组合框中选择的值来仅根据房间类型中选择的值显示数据。My Booking 表和 Room 表通过它们的主键与 BookedRooms 表链接。

Private Sub FrmBookings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim connectionstring As String = "Data Source=dbNEAProject.db"
    Dim ds As New DataSet
    Using con As New SQLiteConnection(connectionstring),
             cmd As New SQLiteCommand("SELECT * FROM BOOKING INNER JOIN customers ON customers.customerID = booking.BCustomerID", con)
        con.Open()
        Dim da As New SQLiteDataAdapter(cmd)
        da.Fill(ds, "booking")
        dt = ds.Tables(0)
        con.Close()
        Dim msSQL As String = "SELECT * FROM booking INNER JOIN customers ON customers.customerID = booking.BCustomerID;"
        DgvBookings.DataSource = display(msSQL, "customers")

        Dim strArray = dt.AsEnumerable().[Select](Function(x) x.Field(Of String)("fname")).ToArray()
        txtBsearchFname.AutoCompleteSource = AutoCompleteSource.CustomSource
        Dim MySource As New AutoCompleteStringCollection()
        MySource.AddRange(strArray)
        txtBsearchFname.AutoCompleteCustomSource = MySource
        txtBsearchFname.AutoCompleteMode = AutoCompleteMode.SuggestAppend



        Try
            dt = New DataTable

            con.Open()

            With cmd
                .Connection = con
                .CommandText = "SELECT DISTINCT customers.fname FROM booking INNER JOIN customers ON customers.customerID = booking.BCustomerID"
            End With

            da.SelectCommand = cmd
            da.Fill(dt)
            Dim r As DataRow

            txtBsearchFname.AutoCompleteCustomSource.Clear()
            For Each r In dt.Rows

                txtBsearchFname.AutoCompleteCustomSource.Add(r.Item(0).ToString)
            Next

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Using

    con.Close()
    da.Dispose()


    Using con1 As New SQLiteConnection(ConStr)
        Using com As New SQLiteCommand("Select CustomerID, fname FROM customers Left JOIN BOOKING ON booking.BCustomerID = customers.customerID where booking.BookingID is null", con1)
            con1.Open()

            Dim dt As New DataTable()

            dt.Load(com.ExecuteReader)
            cmbCustomerData.DataSource = dt
            cmbCustomerData.DisplayMember = "fname"
            cmbCustomerData.ValueMember = "CustomerID"

        End Using
    End Using

    Using con1 As New SQLiteConnection(ConStr)
        Using com As New SQLiteCommand("Select RoomTypeName, RoomTypeID FROM RoomType INNER JOIN ROOMS ON rooms.rRoomTypeID = roomType.RoomTypeID ", con1)
            con1.Open()

            Dim dt As New DataTable()

            dt.Load(com.ExecuteReader)

            cmbRoomType.DisplayMember = "RoomTypeName"
            cmbRoomType.ValueMember = "RoomTypeID"
            cmbRoomType.DataSource = dt
        End Using
    End Using

    Using con1 As New SQLiteConnection(ConStr)
        Using com As New SQLiteCommand("Select RoomNumber, RoomID FROM rooms", con1)
            con1.Open()

            Dim dt As New DataTable()

            dt.Load(com.ExecuteReader)

            cmbRoomType.DisplayMember = "RoomNumber"
            cmbRoomType.ValueMember = "RoomID"
            cmbRoomType.DataSource = dt
        End Using
    End Using



End Sub
Private ConStr As String = "Data Source=dbNEAProject.db"

标签: vb.netsqlite

解决方案


这是因为您将数据绑定到组合框的顺序搞砸了

Using con1 As New SQLiteConnection(ConStr)
    Using com As New SQLiteCommand("Select CustomerID, fname FROM customers Left JOIN BOOKING ON booking.BCustomerID = customers.customerID where booking.BookingID is null", con1)
    con1.Open()

    Dim dt As New DataTable()

    dt.Load(com.ExecuteReader)
    cmbCustomerData.DataSource = dt
    cmbCustomerData.DisplayMember = "fname"
    cmbCustomerData.ValueMember = "CustomerID"

    End Using
End Using

您的第一次使用很好,因为您指定数据源,然后使用 DisplayMember。但是在下一个中,您使用 displaymember 并将数据的源指定为最后一项。这就是为什么它不起作用。

Using con1 As New SQLiteConnection(ConStr)
    Using com As New SQLiteCommand("Select RoomTypeName, RoomTypeID FROM RoomType INNER JOIN ROOMS ON rooms.rRoomTypeID = roomType.RoomTypeID ", con1)
        con1.Open()

        Dim dt As New DataTable()

        dt.Load(com.ExecuteReader)

        cmbRoomType.DisplayMember = "RoomTypeName"
        cmbRoomType.ValueMember = "RoomTypeID"
        cmbRoomType.DataSource = dt
    End Using
End Using

正确的顺序是:

combobox.Datasource --> combobox.DisplayMember -->combobox.ValueMember

但是正如@Jimi 在评论中指出的那样-您在下面的代码中使用了相同的组合框。如果你想使用相同的组合框,你应该使用清除你的实际数据源

cmbRoomType.DataSource = Nothing

其次是

cmbRoomType.Items.clear()

然后你可以再次使用它。但我想这不是你想做的。


推荐阅读