Visual Basic& SQL Picturebox控件

时间:2015-11-06 11:43:30

标签: arrays vb.net picturebox

使用覆盖在图像上的图片框,如下所示。 Click for Form Layout

如果学生上课时表格加载,那么图片框就会变成绿色。如果学生没有上课,那么图片框就会变成空白。

使用SQL我可以查询数据库以返回特定学生参加的所有课程。 这些类存储在数组StudentClass(n)

时间表上有50个类存储在数组AttendsClass(n)中。全部默认值为False。 如果学生参加课程,则数组中的特定参加课程将变为True。

加载表单后,用户可以单击图片框以选择该类,并且数组中相应的出席类变为true。 最后,用户保存表单,将类插回数据库。

我遇到的问题是在最终的Sub Form4_Load中,我目前必须重复相同的代码块50次。这只是检查学生是否参加课程,然后将图片框=设置为GUI上的刻度图像(_new.jpg)。

enter code here
Imports System.Data.OleDb
Public Class Form4
Public con As New OleDbConnection
Public ds As New DataSet
Public da As OleDbDataAdapter
Public cb As OleDbCommandBuilder
Public constring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source    =" & Application.StartupPath & "\wma.accdb"
Public AttendsClass(50) As Boolean
Public StdID As Integer = Form2.DataGridView1.SelectedRows(0).Cells("StudentID").Value
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim Forename As String = Form2.DataGridView1.SelectedRows(0).Cells("Forename").Value
    Dim Surname As String = Form2.DataGridView1.SelectedRows(0).Cells("Surname").Value
    Student.Text = "Student: " & Forename & " " & Surname
    If Not con.State = ConnectionState.Open Then
        con.ConnectionString = constring
        con.Open()
    End If
    da = New OleDbDataAdapter("SELECT * FROM StudentClass WHERE StudentId = " & StdID, con)
    da.Fill(ds, "Class")
    Dim Maxrow As Integer = ds.Tables("Class").Rows.Count
    Dim StudentClass(Maxrow) As Integer
    For n = 1 To 50
        AttendsClass(n) = False
    Next

    For n = 1 To Maxrow
        StudentClass(n) = ds.Tables("Class").Rows(n - 1).Item(1)
        For a = 0 To 50
            If StudentClass(n) = a Then
                AttendsClass(a) = True
            End If
        Next
    Next

    If AttendsClass(1) = True Then
        PictureBox1.Image = My.Resources._new
    End If
    If AttendsClass(2) = True Then
        PictureBox2.Image = My.Resources._new
    End If
    If AttendsClass(3) = True Then
        PictureBox3.Image = My.Resources._new
    End If
    If AttendsClass(4) = True Then
        PictureBox4.Image = My.Resources._new
    End If

End Sub

Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click
    If PictureBox1.Image Is Nothing Then
        PictureBox1.Image = My.Resources._new
        AttendsClass(1) = True
    Else
        PictureBox1.Image = Nothing
        AttendsClass(1) = False
    End If
End Sub

Private Sub PictureBox2_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click
    If PictureBox2.Image Is Nothing Then
        PictureBox2.Image = My.Resources._new
        AttendsClass(2) = True
    Else
        PictureBox2.Image = Nothing
        AttendsClass(2) = False
    End If
End Sub

Private Sub PictureBox4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox4.Click
    If PictureBox4.Image Is Nothing Then
        PictureBox4.Image = My.Resources._new
        AttendsClass(4) = True
    Else
        PictureBox4.Image = Nothing
        AttendsClass(4) = False
    End If
End Sub

Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox3.Click
    If PictureBox3.Image Is Nothing Then
        PictureBox3.Image = My.Resources._new
        AttendsClass(3) = True
    Else
        PictureBox3.Image = Nothing
        AttendsClass(3) = False
    End If
End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    If Not con.State = ConnectionState.Open Then
        con.ConnectionString = constring
        con.Open()
    End If
    Dim cmd As New OleDb.OleDbCommand
    cmd.Connection = con

    'Deletes Existing Records To Be rewritten'
    cmd.CommandText = "DELETE * FROM StudentClass WHERE StudentID=" & StdID
    cmd.ExecuteNonQuery()

    For n = 1 To 50
        If AttendsClass(n) = True Then
            cmd.CommandText = "INSERT INTO StudentClass (StudentID, ClassID) VALUES (" & StdID & "," & n & ")"
            cmd.ExecuteNonQuery()
        End If
    Next
    Me.Dispose()
    MsgBox("Updated Successfully", MsgBoxStyle.Information, "WMA")
    con.Close()
End Sub
End Class

是否可以将其放入循环中以缩短我的代码。代码确实有效,但速度慢且冗长,所以任何改进都会有所帮助。 非常感谢Alex Currie 一名计算机学生 完整代码:

ORDER BY SIZE(products) DESC, bundle.name

1 个答案:

答案 0 :(得分:0)

工作示例:

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles PictureBox1.Click, ...., PictureBox50.Click
    Dim pic As PictureBox = CType(Controls(CType(sender, PictureBox).Name), PictureBox)
    'now you have clicked picturebox
    'you can change image by pic.Image = ...
    'if you want picturebox index, use line below:
    Dim picidx As Integer = CInt(CType(sender, PictureBox).Name.Replace("PictureBox", ""))

End Sub

VB2010Ex。