Как заполнить 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)


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

Тем не менее, вам лучше привязываться к .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