【问题标题】:Populate a VB combo box from a MS Access database row从 MS Access 数据库行填充 VB 组合框
【发布时间】: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], Classroom.MaxCapacity AS Seats FROM [Classroom], [ClassSection], [Faculty], [Course] WHERE (ClassSection.FRedID = Faculty.FRedID) AND Course.CourseTitle = ClassSection.CourseTitle AND Classroom.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) 或几乎任何东西都会比二维数组更好。 [查看示例](stackoverflow.com/a/34164458/1070452)
  • 所以你是说最好只写在课程的各个行中? (抱歉还没睡)
  • 不,我会从数据库加载数据,但我会使用数组以外的东西来存储数据。该链接显示某人正在做您的工作,以及另一种选择。此外,期望正好有 35 门课程是非常糟糕的。
  • 感谢您的帮助,我会查看您发送给我的列表(当然)链接。该项目是一个影子系统,我们获得的数据有限,因此由于我们没有创建新课程,因此它的限制为 35 门课程

标签: vb.net ms-access combobox


【解决方案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。 (如果这听起来很奇怪,请道歉,整天都在做这个,我的大脑变得糊状了)
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多