我有
表学生, student_subject 和 subject_bsit
"student"
-----------------------
|studentID | FullName |
-----------------------
|1234 | John |
|1235 | Michael |
|1236 | Bryce |
"subject_bsit"
-----------------------------------
|subject_id| subject_name |grade |
-----------------------------------
| 1 | Programming | 3 |
| 2 | Networking | 2.5 |
| 3 | Algorithm | 1.75|
| 4 | Physical Educ | 2 |
This is the Junction table to connect the
two now.
"student_subject"
----------------------------
| student_id | subject_id |
----------------------------
| 1235 | 1 |
| 1235 | 2 |
| 1235 | 3 |
| 1234 | 1 |
如您所见,表ID 1235是michael他有三个三个主题,subject_id 1,2和3。我想要做的是在文本框中而不是在datagrid视图中显示michael的所有主题名称和等级。 。
到目前为止,我仍然无法将其输出到文本框。这是我的示例查询
sql = "SELECT subject_name " & _
" FROM student_subject " & _
" INNER JOIN subject_bsit ON subject_bsit.subject_id = student_subject.sub_id" & _
" where student_subject.student_id='" & Txtbox.Text & "'"
上一个查询中的Txtbox.text是用户输入ID号的位置。
这是我在文本框中显示数据的代码。我对如何在文本框上循环并将其显示在每个文本框上没有任何想法或方法。
cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader
While dr.Read
TextBox1.Text = dr.Item("subject_name").ToString
TextBox2.Text = dr.Item("subject_name").ToString
End While
这是我要实现的示例用户界面。非常感谢。
答案 0 :(得分:1)
当您读取查询的结果集时,就会使用一个循环。
While dr.Read
' run this for every row in your resultset
...
End While
While
循环不断进行,直到您读取了所有行。
您不必使用循环。如果您希望一次可以读取一行,就像这样
If dr.Read
' just the first row
End If
If dr.Read
' just the second row
End If
If dr.Read
' just the third row
End If
...
根据您的问题,我想您的表单上有Textbox1
,Textbox2
,... Textbox5
。我还猜你有Grade1
,Grade2
....
要同时处理学科名称和年级,请将查询的第一行更改为
sql = "SELECT subject_name, grade " & _
您可以像这样填充这些项目:
If dr.Read
TextBox1.Text = dr.Item("subject_name").ToString
Grade1.Text = dr.Item("grade").ToString
End If
If dr.Read
TextBox2.Text = dr.Item("subject_name").ToString
Grade2.Text = dr.Item("grade").ToString
End If
If dr.Read
TextBox3.Text = dr.Item("subject_name").ToString
Grade3.Text = dr.Item("grade").ToString
End If
' more of these sets of four lines to fill your whole form.
这可以解决您的问题。但是您可能会注意到它是重复的,荒谬的。您真正需要的是一个文本框数组(实际上是两个数组)。您在程序中创建然后填写这些texbox。 我还没有调试过:这是您要做的。
Dim Subjects As Textbox()
Dim Grades As Textbox()
...
Dim rownumber, Y
rownumber = 0
Y = 200
Dim Subject
Dim Grade
While dr.Read
Subject = New Textbox
Subject.Text = dr.Item("subject_name").ToString
Subject.Width = 200
Subject.Height = 40
Subject.X = 175
Subject.Y = Y
Subjects(rownumber) = Subject
Form.Controls.Add(Subject)
Grade = New Textbox
Grade.Text = dr.Item("grade").ToString
Grade.Width = 50
Grade.Height = 40
Grade.X = 400
Grade.Y = Y
Grades(rownumber) = Grade
Form.Controls.Add(Grade)
rownumber = rownumber + 1
Y = Y + 50
End While
运行此命令时,将有两列控件,每个主题一列。但是这段代码很复杂,您必须先使用Something.Y = value
然后是Y = Y + 50
算术来完成表单的所有布局。
这就是为什么存在网格控件的原因。他们会照顾这种事情。
答案 1 :(得分:0)
如果要动态创建文本框,则应参考@OJones答案
您可以简单地遍历Me.Controls.OfType(Of TextBox)()
cmd = New MySqlCommand(sql, myconn)
dr = cmd.ExecuteReader
While dr.Read
For Each txt As TextBox In Me.Controls.OfType(Of TextBox)()
txt.Text = dr.Item("subject_name").ToString
Next
End While
或者,如果您需要在文本框中填写第一个主题名称,则可以执行类似的方法(如果返回的主题超过文本框,则其他主题将被忽略):
While dr.Read = True
Dim txt As New TextBox = DirectCast(Me.Controls.Find(string.Format("Textbox{0}", cnt ),false).FirstOrDefault(),Textbox);
If Not txt Is Nothing Then txt.Text = dr.Item("subject_name").ToString
cnt += 1
End While
dr.Close()