Как заполнить ComboBox, используя записи из базы данных Access

Я хочу получить данные и отобразить их в ComboBox, но они отображаются пустыми.

Это мой код:

Imports System.Data.OleDb

Public Class frmAirwaybill

    Private Sub frmAirwaybill_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim cm As OleDbCommand = New OleDbCommand("select acc_no from tblshipper order by acc_no")
        cm.Connection = DBconnection()
        Dim dr As OleDbDataReader = cm.ExecuteReader
        Do While (dr.Read())
            txtAccountNo.Items.Add(dr.Item("acc_no"))
        Loop
        dr.Close()
        DBconnection.Close()
    End Sub
End Class*

txtAccountNo – это ComboBox

Что я хочу, когда форма загружается, так это загрузить accno из моей базы данных. Как я могу это сделать?

Это снимок экрана, показывающий ComboBox с пустыми значениями:

это пусто, я хочу, чтобы они отображали данные в поле со списком

Мое подключение к базе данных в порядке.

Это мое соединение с файлом модуля

Public Function DBconnection() As OleDbConnection

        Dim con As New OleDb.OleDbConnection
        Dim constring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\SmartshipG2.mdb"
        con = New OleDb.OleDbConnection(constring)
        con.Open()
        Return con

End Function

person Tahi    schedule 06.06.2017    source источник


Ответы (1)


arrow_upward
1
arrow_downward

Первое, что нужно отметить, это то, что вы не открыли соединение. Вероятно, это первопричина.

Тем не менее, вам лучше привязываться к .DataSource из ComboBox, используя DataTable и устанавливая свойства .DisplayMember и .ValueMember.

Я бы также рассмотрел возможность реализации использования:

Иногда вашему коду требуется неуправляемый ресурс, например дескриптор файла, оболочка COM или соединение SQL. Блок Using гарантирует удаление одного или нескольких таких ресурсов, когда ваш код будет с ними закончен. Это делает их доступными для использования другим кодом.

Наконец, подумайте о том, чтобы дать вашему ComboBox лучший префикс. txt часто используется для элементов управления TextBox. Я использую cmb, в то время как другие могут использовать cbx. Так что в данном случае cmbAccountNo кажется более подходящим.

С изменениями ваш код будет выглядеть примерно так:

Dim dt As New DataTable
Using con As OleDbConnection New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\SmartshipG2.mdb"),
      cmd As New OleDbCommand("SELECT [acc_no] FROM [tblshipper] ORDER BY [acc_no]", con)
    con.Open()

    dt.Load(cmd.ExecuteReader())
End Using

cmbAccountNo.DataSource = dt
cmbAccountNo.DisplayMember = "acc_no"
cmbAccountNo.ValueMember = "acc_no"
person Bugs    schedule 06.06.2017