用户在登陆时要取舍登陆的院校(在combo1中选择),然后在combo2中选择与combo1中已选择的院校所对应的年级

用户在登陆时要选择登陆的院校(在combo1中选择),然后在combo2中选择与combo1中已选择的院校所对应的年级
用户在登陆时要选择登陆的院校(在combo1中选择),然后在combo2中选择与combo1中已选择的院校所对应的年级

Option Explicit
Dim conn As New ADODB.Connection '定义数据库连接变量
Dim reco As New ADODB.Recordset '定义记录集变量
Dim str1 As String
Dim str2 As String
Private Sub Form_Load()
Combo2.Clear
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RollCall.mdb" '打开数据库
Set reco = New ADODB.Recordset
reco.Open "select DepartmentName from DepartmentInfo", conn, 1, 1 '打开记录集,得到线路名数据
    If reco.RecordCount > 0 Then
        reco.MoveFirst
        Do While Not reco.EOF
            Combo1.AddItem (reco.Fields("DepartmentName"))
            reco.MoveNext '处理下一条记录
        Loop
    End If
    Combo1.ListIndex = 0
End Sub
Private Sub Combo2_Click()
Combo2.Clear
str1 = Combo1.Text 'CboInstitute.List(CboInstitute.ListIndex)
reco.Open "select DepartmentID from DepartmentInfo where DepartmentName='" & str1 & "'"
If Not recoa.BOF Then
str2 = reco("DepartmentID")
reco.Close
reco.Open "select ClassName From ClassInfo where DepartmentID= '" & str2 & "'", conn, 1, 1
If Not RecordCount > 0 Then
    reco.MoveFirst
    Do While Not reco.EOF
        Combo2.AddItem (reco.Fields("ClassName"))
        reco.MoveNext
    Loop
End If
Combo2.ListIndex = 0
End Sub

------解决方案--------------------
Private Sub Combo1_lick()
Combo2.Clear
Set reco = conn.Execute("select DepartmentID from DepartmentInfo where DepartmentName = '" & Combo1.List(Combo1.ListIndex) & "'")
If Not reco.EOF
Set reco = conn.Execute("select ClassName From ClassInfo where DepartmentID= '" & reco.Fields("DepartmentID") & "'")
Do Unitl reco.EOF
    Combo2.AddItem (reco.Fields("ClassName"))
    reco.MoveNext
Loop
End If
Combo2.ListIndex = 0
End Sub

------解决方案--------------------
这就与数据库的设计有关了。

你现在的 ClassName 中把级与班合并了。可以将其分为两个字段,例如 GradeName 和 ClassName,分别容纳 12 级和 1 班。

查询时,
"Select Distinct GradeName From ClassInfo where DepartmentID= '" & reco.Fields("DepartmentID") & "'"

如果不改数据库,就只能加代码补救了(但存在字段内容不规范引起程序错误的风险):
(在公共段)
Private Declare Function SendMessagebyString Lib _
"user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As String) As Long

Private Const CB_FINDSTRINGEXACT = &H158    '在 ComboBox 中精确查找
Dim strTmp As String

(在过程代码段)
......
Do Unitl reco.EOF
    strTmp = Left(reco.Fields("ClassName"), InStr(reco.Fields("ClassName"), "级") - 1)
    If -1 = SendMessagebyString(Combo2.hWnd, CB_FINDSTRINGEXACT, -1, strTmp) Then
        Combo2.AddItem strTmp
    End If
    reco.MoveNext
Loop