从 MS Access 数据库行填充 VB 组合框

Posted

技术标签:

【中文标题】从 MS Access 数据库行填充 VB 组合框【英文标题】:Populate a VB combo box from a MS Access database row 【发布时间】:2015-12-09 10:59:16 【问题描述】:

我试图将一列整行添加到组合框中。 当我尝试时,它要么只显示该列的最后一行,要么只显示最后一行 35 次。

我错过了什么?这真让我抓狂。我为评论的行道歉,我正在尝试一些不同的编码。

Option Strict On
Imports System.Data.OleDb
Imports ShadowLogin.GlobalVariables
Public Class DeptNewSch

Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    Me.Close()
    ShadowMain.Show()
End Sub

Private Sub DeptNewSch_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim CourseArray(35, 2) As String

    Using cnnOLEDB = New OleDbConnection(strConnectionString)
        Dim NewSchDS As DataSet
        Dim NewSchTables As DataTableCollection
        Dim NewSchsource1 As New BindingSource

        NewSchDS = New DataSet
        NewSchTables = NewSchDS.Tables

        Using cmd As New OleDbCommand("SELECT ClassSection.CourseTitle AS Course, ClassSection.SectionNumber AS [Section Number], ClassSection.ScheduleNumber AS [Schedule Number], Course.ShortTitle AS [Course Title], Course.Units, ClassSection.Type AS Format, ClassSection.TimeSlot AS [Days / Time], ClassSection.RoomID AS Location, Faculty.[First Name], Faculty.[Last Name], Clas-s-room.MaxCapacity AS Seats FROM [Clas-s-room], [ClassSection], [Faculty], [Course] WHERE (ClassSection.FRedID = Faculty.FRedID) AND Course.CourseTitle = ClassSection.CourseTitle AND Clas-s-room.RoomID = ClassSection.RoomID AND ClassSection.ScheduleYear=@Year AND ClassSection.Semester=@Semester;", cnnOLEDB)
            cmd.Parameters.Add("@Year", OleDbType.VarWChar).Value = Convert.ToInt32(strYear.ToString())
            cmd.Parameters.Add("@Semester", OleDbType.VarWChar).Value = strSemester.ToString()

            Using NewSchDA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
                NewSchDA.Fill(NewSchDS, "New Semester") 'Change items to your database name
                Dim view As New DataView(NewSchTables(0))
                NewSchsource1.DataSource = view
                dgNewSch.DataSource = view
                Me.dgNewSch.Columns("Course").Width = 60
                Me.dgNewSch.Columns("Section Number").Width = 50
                Me.dgNewSch.Columns("Schedule Number").Width = 60
                Me.dgNewSch.Columns("Course Title").Width = 190
                Me.dgNewSch.Columns("Units").Width = 40
                Me.dgNewSch.Columns("Format").Width = 70
                Me.dgNewSch.Columns("Days / Time").Width = 100
                Me.dgNewSch.Columns("Location").Width = 70
                Me.dgNewSch.Columns("First Name").Width = 80
                Me.dgNewSch.Columns("Last Name").Width = 80
                Me.dgNewSch.Columns("Seats").Width = 50
            End Using
        End Using
    End Using

    'Connect to Database and get the registration information
    Using cnnOLEDB = New OleDbConnection(strConnectionString)


        ' Query the classschedule table for start of semester datas
        Using cmdOleDB = New OleDbCommand("SELECT [CourseTitle], [ShortTitle],[Units] FROM [Course] WHERE rownumber =@row", cnnOLEDB)
            cnnOLEDB.Open()
            Using rdrOLEDB = cmdOleDB.ExecuteReader
                While rdrOLEDB.Read
                    Dim l As Integer

                    For l = 0 To 35
                        'cmdOleDB.Parameters.Add("@row", OleDbType.VarWChar).Value = l
                        CourseArray(l, 0) = rdrOLEDB.Item(0).ToString
                        CourseArray(l, 1) = rdrOLEDB.Item(1).ToString
                        CourseArray(l, 2) = rdrOLEDB.Item(2).ToString
                    Next




                    ' CboFormat.Items.Add()
                    ' CboDayTime.Items.Add()
                    ' CboLocation.Items.Add()
                    ' CboName.Items.Add()
                End While
            End Using
        End Using
    End Using

    For z As Integer = 0 To 35

        CboCourse.Items.Insert(z, CourseArray(z, 0).ToString)

    Next

End Sub

结束类

您可以猜到这是我一直在处理的代码。 如果我试图做的事情是可能的,任何帮助都会很棒。

【问题讨论】:

循环是否准确预测了 35 条记录?根据数据,CBO 可以绑定到一个列表,其中包含像 DGV 一样读取的行 ...a List(Of Course) 或几乎任何东西都会比二维数组更好。 [查看示例](***.com/a/34164458/1070452) 所以你是说最好只写在课程的各个行中? (抱歉还没睡) 不,我会从数据库加载数据,但我会使用数组以外的东西来存储数据。该链接显示某人正在做您的工作,以及另一种选择。此外,期望正好有 35 门课程是非常糟糕的。 感谢您的帮助,我会查看您发送给我的列表(当然)链接。该项目是一个影子系统,我们获得的数据有限,因此由于我们没有创建新课程,因此它的限制为 35 门课程 【参考方案1】:

每次读取数据源中的记录时,都会运行 0 到 35 循环。

While rdrOLEDB.Read
                    Dim l As Integer

                    For l = 0 To 35
                        'cmdOleDB.Parameters.Add("@row", OleDbType.VarWChar).Value = l
                        CourseArray(l, 0) = rdrOLEDB.Item(0).ToString
                        CourseArray(l, 1) = rdrOLEDB.Item(1).ToString
                        CourseArray(l, 2) = rdrOLEDB.Item(2).ToString
                    Next
Name.Items.Add()
                End While

【讨论】:

有没有办法在不记录之前的数据的情况下进行循环? 为什么需要循环?每次通过 While 循环就增加 l。 我应该问是否有更好的方法来做到这一点? 没关系,但我会从 While 循环内部将项目直接添加到 Names 对象,而不是构建字符串数组。 我正在获取课程名称以从数据库中填充组合框,因此如果数据库已更新,则应使用新课程名称更新此 cbo。 (如果这听起来很奇怪,请道歉,整天都在做这个,我的大脑变得糊状了)

以上是关于从 MS Access 数据库行填充 VB 组合框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2007 中使用值填充组合框

带有行着色的MS Access VBA列表框?

MS Access,根据文本框条目填充组合框

MS access 2007 使用组合框填充图片

MS Access:从 SQL 传递组合框值

MS Access:组合框列顺序问题